3

10のマイナスの累乗を計算したいと思いmます。数学関数を使用することに加えて、pow(10, -m)それを行うための高速で効率的な方法はありますか?

SOのc++の達人にこのような簡単な質問をするのは、ご存知のように、ベース2、10も特別なベースであるということです。ある値nに10の累乗からマイナスmを掛けた値の場合、nの小数点を左にm回移動することに相当します。私はそれが対処するための速くて効率的な方法でなければならないと思います。

4

8 に答える 8

5

浮動小数点mの場合、標準ライブラリの実装が適切に記述されている限り、pow効率的です。

mが整数であり、整数であるとほのめかした場合は、事前に計算された値の配列を使用できます。

そのルーチンがコードのボトルネックである場合にのみ、この種のことを心配する必要があります。つまり、そのルーチンの呼び出しが合計実行時間のかなりの割合を占める場合です。

于 2011-05-27T07:00:56.560 に答える
4

10はバイナリマシンでは特別な値ではなく、2つだけです。二乗による使用powまたは指数化

于 2011-05-27T07:01:03.437 に答える
2

残念ながら、IEEE 754 浮動小数点表現を使用して高速かつ効率的に計算する方法はありません。結果を取得する最速の方法は、関心のあるすべての値のテーブルを作成しm、ルックアップを実行することです。

于 2011-05-27T07:01:51.137 に答える
0

それを行うための高速で効率的な方法があれば、組み込みシステムで実行している場合を除いて、CPUがそれをサポートしていると確信しています。組み込みシステムで実行している場合は、pow(...)実装が適切に記述されていることを望みます。

私たちのほとんどは10本の指を持っているので、10は私たちにとって特別です。コンピュータは2桁しかないので、2桁は特別です。:)

于 2011-05-27T07:00:23.310 に答える
0

特に m が整数の場合は、1000 を超える浮動小数点数を使用できません。ルックアップ テーブルを使用してください。

于 2011-05-27T07:05:15.650 に答える
0

さらなる解決策につながるかもしれないいくつかのアイデア...

  1. アルゴリズム レベルでの最適化に関心がある場合は、並列化されたアプローチを探すことができます。

  2. Ipp (Intel プロセッサの場合)、または AMD の AMD Core Math Library (ACML) を使用すると、システム/アーキテクチャ レベルで高速化できます。

  3. グラフィックカードの能力を利用するのは別の方法かもしれません (例: NVIDEA カード用の CUDA)

  4. OpenCLも検討する価値があると思います

于 2011-05-27T07:19:33.340 に答える
0

n ではなく log n をかなりの時間使用できれば、時間を節約できます。

n = pow(10*n,-m)

計算する必要があります (定義 l = log10(n) を使用)

l = -m*(l+1)
于 2011-05-27T07:14:47.817 に答える
0

IEEE 754 では、多数の浮動小数点形式が指定されています。広く使用されているものはバイナリです。つまり、基数 10 は決して特別なものではありません。これは、「10 も特別な基数である」というあなたの仮定に反しています。

興味深いことに、IEEE 754-2008 では 10 進浮動小数点形式 (decimal32およびその仲間) が追加されています。ただし、それらのハードウェア実装にはまだ遭遇していません。

いずれにせよ、プロファイリングを行い、これが実際にボトルネックであることを確認する前に、コードをマイクロ最適化するべきではありません。

于 2011-05-27T07:07:42.687 に答える