浮動小数点数(float)と二重精度(double)遮断の問題


計算の際,浮動小数点数(float)と二重精度(double)の遮断は,往々にして予想外の結果をもたらす.
のように
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