フロートの二乗を何度も計算する必要があります(10 ^ 8のオーダーまで)
どちらが良いですか(時間が大きな制約であるため):
pdt=pow(num,2);
OR
pdt=num*num
それとも本当に同じですか?
編集:適度に大きな入力で両方のスタイルをチェックすると、私のプロセッサは矛盾した結果を出しました。
フロートの二乗を何度も計算する必要があります(10 ^ 8のオーダーまで)
どちらが良いですか(時間が大きな制約であるため):
pdt=pow(num,2);
OR
pdt=num*num
それとも本当に同じですか?
編集:適度に大きな入力で両方のスタイルをチェックすると、私のプロセッサは矛盾した結果を出しました。
num*num
少なくとも1つの浮動小数点乗算またはより時間のかかる操作なしpow(num, 2)
の実装はないため、少なくとも1つの非逆C /C++実装と同じくらい高速になります。pow
最適化なしでgccを使用するとpow
、関数呼び出しが発生するため、num*numの方が高速です。それらで同じ-O2
asmを出力します(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