2013-05-28 13 views
17

私のプログラムは、std::pow(double,int)機能でCPU時間の90%を費やします。正確さはここでは第一の関心事ではないので、より速い選択肢があるかどうか疑問に思っていました。私が試みていることの1つは、フロートにキャストし、操作を実行し、次に2倍に戻すことです(まだ試していません)。私は(ほとんどのCPUは、本質的にとにかくダブルスで動作しないのですか?)std :: powより速いのは何ですか?

乾杯あなたが働くかもしれないログ領域で動作し、何をする必要があるかに応じて、

+2

あなたが計算している力に依存しています - コードを表示したり、データを記述してください。 – paddy

+1

ハードウェアは一般的にはソフトウェアより高速です。これは 'pow'のようなものです...あなたがしていることに追加の制限を加えることができない限り、それを打つことはできません。 – Mehrdad

+1

この記事は役に立つかもしれません:http://martin.ankerl.com/2012/01/25/optimized-approximative-pow-in-c-and-cpp/ –

答えて

14

マーティンAnkerlOptimized Approximative pow() in C/C++が1であり、それは2つの高速バージョンがあり、次のように1は、この記事のいくつかを持っているように見えます:

た組合を通じてタイプpunningに依存している
inline double fastPow(double a, double b) { 
    union { 
    double d; 
    int x[2]; 
    } u = { a }; 
    u.x[1] = (int)(b * (u.x[1] - 1072632447) + 1072632447); 
    u.x[0] = 0; 
    return u.d; 
} 

組合で

、非静的データメンバの最大1つであることができる:ドラフト標準セクション9.5[class.union]からC++における未定義の動作は、ありますいつでも、つまり、 の値で、非静的データメンバーのほとんどは、いつでもユニオンに格納することができます。 [...]

しかしgcc support this with well defined behaviorを含むほとんどのコンパイラを:

(「タイプ-punning」と呼ばれる)は、最も最近に書き込まれたものとは別の組合員からの読み取りの練習が一般的です。偶数型punningが許可される-fstrictエイリアシングと、メモリは組合型

を介してアクセスされているが、私は同じコードを生成する必要がmemcpyを用いpoint out in my answer here未定義呼び出さないない普遍的なthis article points outように、これは提供されます動作。

また、2番目のOptimized pow() approximation for Java, C/C++, and C#にリンクしています。

最初の記事はまた、彼のマイクロベンチマークにリンクhere

9

これは、パフォーマンスを改善する移植可能な方法ではないことを懸念していますつまり、すべての値を対数で置き換えます。乗算は加算になり、除算は減算になり、べき乗は乗算になります。しかし今やの加減算は、高価で多少エラーを起こしやすい操作になります。

4

あなたの整数がどのくらいありますか?彼らはコンパイル時に知られていますか? x^2pow(x,2)ではなくx*xと計算するほうがはるかに優れています。注:整数電力に対するpow()のほとんどすべてのアプリケーションは、第2または第3の電力(または負の指数の場合は乗法逆数)にいくらかの数を上げます。そのような場合にはpow()を使用することは過剰です。これらの小さな整数にはテンプレートを使用するか、x*xを使用してください。

コンパイル時に整数が小さく、たとえば-12〜+12のように整数がわからない場合、乗算はまだpow()になり、精度が失われません。 x^12を計算するために11回の乗算は必要ありません。 4人で行う。 x ^(2n)=(x^n)^ 2とx ^(2n + 1)= x *(x^n)^ 2という事実を使う。たとえば、x^12は((x * x * x)^ 2)^ 2です。x^3(x * x * x)を計算するための2つの乗算、x^6を計算するもう一つの乗算、およびx^12を計算するための最後の乗算。

+0

もちろん、これはausairmanが整数で作業していることを前提としています。そうかどうかは不明だ。 – jamesdlin

+0

@ジャムダイン:もちろん彼はそうです。 *私のプログラムは、std :: pow(double、int)関数でCPU時間の90%を費やします。* –

+0

おっと、申し訳ありません。あなたが正しい;今日私の脳は休日だと思う。 > _ < – jamesdlin

関連する問題