首页 新闻 会员 周边 捐助

下面输出结果为什么不一样?

0
[待解决问题]
#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

现在重定向了,访问不到了。

求解释,或者之前有访问到并记录的同学,发来他们是怎么解释的。

木鸟飞的主页 木鸟飞 | 菜鸟二级 | 园豆:219
提问于:2016-04-13 07:46
< >
分享
所有回答(3)
0

把for循环每行的i、sum输出来看下就知道了

SmileZhen | 园豆:236 (菜鸟二级) | 2016-04-13 09:01

然而。。。

呃,开始输出的时候感觉到了差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.

支持(0) 反对(0) 木鸟飞 | 园豆:219 (菜鸟二级) | 2016-04-13 09:45

@木鸟飞:float会比double的小数点后自动多9?

支持(0) 反对(0) SmileZhen | 园豆:236 (菜鸟二级) | 2016-04-13 14:29
0

楼上说的极是。

空明流光 | 园豆:111 (初学一级) | 2016-04-13 09:42

支持(0) 反对(0) 木鸟飞 | 园豆:219 (菜鸟二级) | 2016-04-13 09:50

喏~

把结果优化了下~~~,能看出什么端倪嘛、、、

支持(0) 反对(0) 木鸟飞 | 园豆:219 (菜鸟二级) | 2016-04-13 09:52

@木鸟飞: 下面的循环比上面的循环多走了一次

支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2016-04-13 09:54

@木鸟飞: 在即将等于1时打断点,看看为什么 double 1 <= 1.0f 不成立?

支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2016-04-13 09:56

@沧海一杰: 昂~为什么不成立。。。

支持(0) 反对(0) 木鸟飞 | 园豆:219 (菜鸟二级) | 2016-04-13 10:43
0

第一个是根据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

visonme | 园豆:1674 (小虾三级) | 2016-04-13 10:03

为什么float的时候就能取=,在double的时候不能取=【首先基于:double不能精确存储数据开始【这个前提是没有问题的,如果有异议可以讨论。】猜想:double是8个字节,float是4个字节。所以存储的小数数位是不同的。假设double 能存储 0.999 999 999,而float能存储 0.999 999,哦,并不知道,解释不通。。。】

并且 题目里面写的是<=,这里换成< 没有问题嘛。。。

支持(0) 反对(0) 木鸟飞 | 园豆:219 (菜鸟二级) | 2016-04-13 10:42

@木鸟飞: 

<= 换成 < 纯属个人疏忽

这里给出两篇参考文章,注意留意每个评论

One

Two

支持(0) 反对(0) visonme | 园豆:1674 (小虾三级) | 2016-04-13 11:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册