浮動小数点数(float)と二重精度(double)遮断の問題
計算の際,浮動小数点数(float)と二重精度(double)の遮断は,往々にして予想外の結果をもたらす.
のように
最終印刷
9.00023
でも
8.99999999999996
このような小数点以下の計算では、+=は特に遮断問題を引き起こしやすく、特にfloatの精度があまり高くない場合、+=は使用しないほうがよい.
海外にリンクがあって、とても长くて、暇があったら行ってみます
What Every Computer Scientist Should Know About Floating-Point Arithmetic http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
のように
float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.7g
", b);
最終印刷
9.00023
でも
double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.15g
", b);
最終印刷8.99999999999996
このような小数点以下の計算では、+=は特に遮断問題を引き起こしやすく、特にfloatの精度があまり高くない場合、+=は使用しないほうがよい.
海外にリンクがあって、とても长くて、暇があったら行ってみます
What Every Computer Scientist Should Know About Floating-Point Arithmetic http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html