4

特定のブロックで、実数を約 3*500*500 倍する必要があるアプリケーションを作成しています。exp(y*log(x)) アルゴリズムを使用すると、プログラムが著しく遅くなります。データ型の操作に基づいた別のアルゴリズムを使用すると大幅に高速になりますが、そのアルゴリズムはあまり正確ではありませんが、シミュレーションにはまともな結果が得られ、速度に関してはまだ完全ではありません。

exp(y*log(x)) よりも高速な実数の累乗の正確な累乗アルゴリズムはありますか?

前もって感謝します。

4

2 に答える 2

5

優れた精度が必要で、事前に基数 (x 値) の分布について何も知らない場合は、 pow(x, y) が最も移植性の高い答えです (すべてではなく多くのプラットフォームで、これはexp(y*log(x)) よりも高速であり、数値的にも優れています)。x と y がどの範囲にあり、どの分布であるかについて何か知っていれば、アドバイスを提供しようとする人々にとって大きな助けになるでしょう。

優れた精度を維持しながら高速に実行する通常の方法は、x 値の配列と y 値の配列に対してこれらの計算の多くを同時に実行するように設計されたライブラリ ルーチンを使用することです。問題は、そのようなライブラリの実装には費用がかかる (Intel の MKL のように) か、プラットフォーム固有 (たとえば、OS X の Accelerate.framework の vvpowf) になる傾向があることです。私は MinGW についてあまり知らないので、他の誰かが MinGW で何が利用できるかを説明する必要があります。GSL には、これらの線に沿った何かがあるかもしれません。

于 2009-09-20T19:31:56.217 に答える
4

アルゴリズムによっては (特に追加がほとんどまたはまったくない場合)、対数空間で (少なくとも部分的に) 作業を回避できる場合があります。おそらくすでにこれを検討しているでしょうが、中間表現が log_x と log_y の場合、log(x^y) = exp(log_y) * log_x の方が高速になります。それについて選択することさえできれば、明らかに log(x^y) を y * log_x として計算する方がさらに安価です。冪乗を少しでも回避できれば、多くのパフォーマンスが得られる可能性があります。最も内側のループの外でべき乗演算を取得するために必要なループを書き直す方法があれば、それはかなり確実なパフォーマンスの勝利です。

于 2009-09-20T19:53:47.223 に答える