1

フロートの二乗を何度も計算する必要があります(10 ^ 8のオーダーまで)

どちらが良いですか(時間が大きな制約であるため):

 pdt=pow(num,2);

      OR

 pdt=num*num

それとも本当に同じですか?

編集:適度に大きな入力で両方のスタイルをチェックすると、私のプロセッサは矛盾した結果を出しました。

4

2 に答える 2

10

num*num少なくとも1つの浮動小数点乗算またはより時間のかかる操作なしpow(num, 2)の実装はないため、少なくとも1つの非逆C /C++実装と同じくらい高速になります。pow

于 2013-03-11T23:02:40.473 に答える
6

最適化なしでgccを使用するとpow、関数呼び出しが発生するため、num*numの方が高速です。それらで同じ-O2asmを出力します(x86の場合):

float numpow(float x){
    return pow(x, 2);
}

float mulpow(float x){
    return x*x;
}

compiled with g++ -S -O2 -c 

__Z6numpowf:
Leh_func_begin1:
    pushq   %rbp
Ltmp0:
    movq    %rsp, %rbp
Ltmp1:
    mulss   %xmm0, %xmm0
    popq    %rbp
    ret
Leh_func_end1:

...
__Z6mulpowf:
Leh_func_begin2:
    pushq   %rbp
Ltmp2:
    movq    %rsp, %rbp
Ltmp3:
    mulss   %xmm0, %xmm0
    popq    %rbp
    ret
于 2013-03-11T23:05:26.407 に答える