2013-02-27 19 views
5

私のプログラムでは、Math.pow()を使用して、2の累乗に対する比較的大きな倍精度数を計算します。その後、非常に大きなダブルの平方根数。問題は、私はこれを10万回以上やらなければならず、それは本当に長くかかることです。このプロセスをスピードアップできる選択肢はありますか?ありがとうJava - Math.pow()とMath.sqrt()のより速い代替手段

編集:私は1000から10000の間に大きな数字で表します(コンピューティングの言葉ではそうではないでしょう)。時間がかかるという点で、関数を500回実行するのに約30秒かかります。

+0

同じ操作を100,000回の固有番号に対して実行する必要がありますか? – Brad

+5

"比較的大きい"、 "非常に大きい"、 "本当に長い"を定義できますか? – asteri

+0

http://stackoverflow.com/questions/7902418/the-best-alternative-of-math-pow-in-j2me – Brad

答えて

7

Java Mathよりも優れた(高速な)実装はほとんどありません。あなたのアルゴリズムで計算を行う方法を変更しようとすると、より多くの運があるかもしれません。たとえば、巨大な数の平方根を見つけるのを避ける方法はありますか?

これがうまくいかない場合は、Matlabのような高速な数学的計算を目的とした、より適切な言語で実装してみてください。

これ以外の場合は、他の領域でこれを最適化することができます。おそらく、後で役に立つ場合は、過去の結果をキャッシュすることができます。

+0

ユークリッド距離の式が含まれているので、避けられません – Matt9Atkins

+0

@ Matt9Atkinsあなたは本当にユークリッド距離が必要ですか?あなたはその広場を比較のために使うことができます... –

+0

これをスピードアップするためのオプションはまだあります。実際の距離が必要ですか、それとも単に比較していますか?それらを比較しているだけなら、平方根部分を避けることができます。 – Oleksi

8

「2の累乗」は二乗です。番号をそれ自体で乗算することによって、それをやるほうがよいでしょう。

sqrtのライブラリバージョンは、おそらくあなたが他の場所で掘り起こすことができるものより高速です。 Cルーチンを呼び出すと、クロスランゲージコールのオーバーヘッドを追加するだけです。しかし、正確な平方根が必要か、または近似のテーブルルックアップがありますか?値は頻繁に繰り返されますか?つまり、同じ数値のルーツを計算する必要がある場合がありますか?その場合は、平方根をHashMapにキャッシュする方が計算時間がかかる場合があります。

1

2の威力で問題が発生した場合は、数字をそれ自体で掛けるだけで簡単に行うことができます。 例えば、変数aは、あなたがそれは同じだ2まで上昇する番号であると言うことができます:あなたは、x * xの代わりに、POW(X、2)の使用ができ int a=5; int b=a*a;

0

平方根については、まずsqrtの実装(近似法)を見てください。

たとえば、Newton's method(方程式sqrt(N)-x = 0)のように、より良い方が見つかるかもしれません。

また、必要な精度にもよりますが、精度と時間をトレードすることができます。

同じエントリに複数の計算を行わないように結果を保存することもできます。

+0

確かに、あなたは 'pow(x、2)'の代わりに 'x * x'を使うことができます。もちろん、x * xとして計算する方がいいでしょう。 – NovaDenizen

+0

右、修正済み... – fso

1

私が考えることができるのはスピードの結果を格納することだけで、平方根は変更されず、9000個の格納された数値はそれほど多くはありません。適切な結果を最適に検索できるように、データをフレーム化することはおそらくうまくいくでしょう。

関連する問題