#include <iostream> using namespace std; int main(){ double sum = 0; for (double i = 0.01f; i <= 1.0f; i += 0.01f){ sum += i; } cout << sum; sum = 0; for (double i = 0.01; i <= 1.0; i += 0.01){ sum += i; } cout << sum; system("pause"); return 0; }
这段来自:《C++程序设计》一书第84页。
里面给了网址链接是:
www.cs.armstrong.edu/liang/cpp.note.pdf
现在重定向了,访问不到了。
求解释,或者之前有访问到并记录的同学,发来他们是怎么解释的。
把for循环每行的i、sum输出来看下就知道了
然而。。。
呃,开始输出的时候感觉到了差1(50.5-49.5)可是为什么到不了1呢。感觉 从0.01到1太远了。所以开始试了一个0.90这个时候两者的结果是一样的。但是把这个数字设置成0.50,结果就又不同,然后也设置了0.80,0.75.这样的值,并没有找临界值,但是感觉0.75以前的数字都会相差1,0.80以后的输出结果就是相同的。【所以0.80以后的数据刚好用float能存下,所以两个结果就是相同的?但是如果在0.75以前超过了4个字节的存储,所以是否显性指明f,就会产生明显差异么?】
光从输出结果上,每次打印,感觉并不能解决问题。。。知道会差1,可是不知道为什么会差1.
@木鸟飞:float会比double的小数点后自动多9?
楼上说的极是。
喏~
把结果优化了下~~~,能看出什么端倪嘛、、、
@木鸟飞: 下面的循环比上面的循环多走了一次
@木鸟飞: 在即将等于1时打断点,看看为什么 double 1 <= 1.0f 不成立?
@沧海一杰: 昂~为什么不成立。。。
第一个是根据float来比较的
第二个根据double来比较
问题应该就出现在不同类型比较导致最后一个i值在比较时候第一次循环会多一步计算,而第二个循环在最后一个计算时候直接就break了
这种解释不知道对不对,没有验证,但是可以这样做个试验看看输出,如楼上说的
double sum = 0; for (float i = 0.01f; i < 1.0f; i += 0.01f){ std::cout<<"--------------------:"<<i; sum += i; } std::cout << sum; sum = 0; for (double i = 0.01; i < 1.0; i += 0.01){ std::cout<<"===============:"<<i; sum += i; } std::cout << sum;
pS:将第一个循环的 i 类别有double改为float