浮点错误

时间:2012-11-19 12:28:06

标签: c floating-point floating-point-conversion

#include <stdio.h>
int main()
{
    int n;
    while ( scanf( "%d", &n ) != EOF ) {
        double sum = 0,k;
        if( n > 5000000 || n<=0 )   //the judgment of the arrange
            break;
        for ( int i = 1; i <= n; i++ ) {
            k = (double) 1 / i;
            sum += k;
        }
        /*
        for ( int i = n; i > 0; i-- ) {
            k = 1 / (double)i;
            sum += k;
        }
        */
        printf("%.12lf\n", sum);
    }
    return 0;
}

为什么在不同的循环中我得到不同的答案。有浮动错误吗?当我输入5000000时,总和为16.002164235299,但当我使用另一个循环for(符号部分)时,我得到总和16.002164235300

2 个答案:

答案 0 :(得分:9)

因为floating point math is not associative

即。 (a + b) + c不一定等于a + (b + c)

答案 1 :(得分:1)

我也碰到了+ b + c问题。完全同意ArjunShankar。

import os 
zip_file_path = "C:\AA\BB"
file_list = os.listdir(path)
abs_path = []
for a in file_list:
    x = zip_file_path+'\\'+a
    print x
    abs_path.append(x)
for f in abs_path:
    zip=zipfile.ZipFile(f)
    zip.extractall(zip_file_path)

大多数浮点运算都是在mantis数据丢失的情况下执行的,即使组件很好地适合它(数字如0.5或0.25)。 事实上,我很高兴在我的应用程序中找出bug的原因。我写了一篇简短的提醒文章,详细解释如下:

http://stepan.dyatkovskiy.com/2018/04/machine-fp-partial-invariance-issue.html

以下是C示例。祝你好运!

example.c

// Here A != B in general case
float A = ( (a + b) + c) );
float B = ( (a + c) + b) );