質問
私は、JavaにはいくつかのC ++コードを移植するの真ん中にいるよ、と私は誰でも、それは次のことをやって保管書いたインスタンス間で実行し続けるます:
double c = (1.0/(a+1.0)*pow(b, a+1.0));
double d = (1./(integral(gamma, dmax)-integral(gamma, dmin)))*(integral(gamma+1, dmax)-integral(gamma+1, dmin));
の代わりに:
double c = pow(b, a+1.0)/(a+1.0);
double d = (integral(gamma+1, dmax)-integral(gamma+1, dmin))/(integral(gamma, dmax)-integral(gamma, dmin));
二つ目はより明確ようで、私はCでの操作の順序について間違っている場合を除き++彼らは同じことを行う必要があります。第1、第2及びませんを行うには、いくつかの理由がありますか?私は考えることができる唯一の事は精度でいくつかの奇妙なケースになります。
解決
はい、彼らは同じです。私は考えることができる唯一の理由は、数学的な明快です:あなたは量を正規化しているときに時々、あなたが頻繁に書きます:
answer = (1/total) * (some of it)
たとえば、コーシーの積分定理が頻繁に書き込まれ、
f(a) = (1/(2*pi*i)) * integral(f(z)/(z-a), dz)
他のヒント
a
は同じままで、(あなたのコードはループ内にあり、それがb
変数だからa
は、例えば2回の反復の間で変化していないことは明らかだ場合、例えば)const
が変更されている場合は、、その後、元のバージョンは、より高速に実行することができます乗算は除算よりも安価であるため、(コンパイラは、ループの外1/...
の計算を移動すると仮定)。
それが理由だ場合には、最適化時の見当違いの試みのように思えるが、それは、それはそれではないという意味ではありません。
どちらかといえば1/...
のための追加的な丸め誤差があるため、ああ、と精度について、元のバージョンは、実際にあなたより、少し精度が低くなります。それは自身の意志の元のバージョンにあなたのバージョンを変換するから、コンパイラを防ぐこの丸め誤差です。彼らはまったく同じこと(ただし、非常に近いもの)を計算しません。
はい、彼らは同じことを行う必要があります。原作者はここで、
他に見つかった方程式を複製された可能性があります所属していません StackOverflow