#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
。
答案 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) );