| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1236 人关注过本帖
标题:求教一下循环更新变量的问题,书上的答案和我学的概念有冲突
取消只看楼主 加入收藏
烈阳雨
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2013-3-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
求教一下循环更新变量的问题,书上的答案和我学的概念有冲突

书上有道例题是求 (1-1/2 +1/3 -1/4 .......-1/100)的值。
下方附上我自己写的解法和书上的解法。两者输出结果一样,附上它只是为了表示我经过自己的思考和行动,并不是遇到不懂就来发帖找大神什么的。
我自己做了次,用的是for循环(现在只学了这个),然后再看答案,答案是用while解的,能看懂答案的意思。
但是在分母循环递增这块他用的是浮点型,我看郝斌老师的视频很明确的讲过,循环更新的变量不能定义为浮点型。
而书上的解法是定义了double,这点我很不明白。
这两者谁错了呢。

自己解题如下:
# include <stdio.h>
int main(void)
{
    int i;
    int sign = 1;
    float sum = 1;
    for (i = 2; i < 101; ++i)
    {
        sign = -1 * sign;
        sum = sum + sign * 1.0/i;
    }
    printf("sum = %f.\n", sum);


    return 0;
}
/*在VC++6.0中输出的结果是
sum = 0.688172.
*/

书上的例题解法为:
# include <stdio.h>
int main(void)
{
    int sign = 1;
    double deno = 2.0,sum = 1.0, term;
    while (deno <= 100)
    {
        sign = - sign;
        term = sign / deno;
        sum = sum + term;
        deno = deno + 1;  //此处的deno为浮点型
    }
    printf("%f\n", sum);
}
/*在VC++6.0中输出的结果是
sum = 0.688172.
*/
搜索更多相关主题的帖子: include double 
2013-03-26 22:25
烈阳雨
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2013-3-19
收藏
得分:0 
回复 2楼 wp231957
我看的是郝斌老师的视频,讲到循环的“为什么循环更新的变量不能定义为浮点型”时他解释过。
我的理解是:float 和 double 都不能保证可以精确的存储一个小数,计算机存储浮点型数字时用的是非常接近的一个数,比如3可能是3.0000001(举个例子,有错请提点),若是多次循环的累积可能让一个微不足道的小差值变成足以影响到输出结果的不可忽视之差。
举例:
 例:有一个浮点型变量X,如何判断X的值是否为零。
错误做法:
            if (x == 0)
               
            else  
                不是
        因为X就算是0,也未必会是以0存储的,可能用0.0000000001存储呢。
正确做法:
if( |x – 0.000001| <= 0.000001)  
/* 注意括号里的差打上了取绝对值符号 */
   
else  
    不是

2013-03-26 22:44
烈阳雨
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2013-3-19
收藏
得分:0 
回复 4楼 wp231957
两个代码都成功运行了,得出的结果也相同,质疑编译什么的我没那水平,没那功夫,也没那心思。
我只是来请教一下为什么书上和老师讲的不一样,这是很明显的不同,而这个不同是否有其特殊性,或者说是我的理解错了还是这书和老师这二者有一方错了。
我并没有指责任何一方,这点请你注意,从始至终我都是抱着前来学习的态度。
2013-03-26 22:57
烈阳雨
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2013-3-19
收藏
得分:0 
回复 4楼 wp231957
至于举例,是视频里讲的,然后我说了我对这段内容的理解,并不是要说服谁,而是把我的理解说出来,请你看看有何不足。
2013-03-26 23:00
烈阳雨
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2013-3-19
收藏
得分:0 
回复 8楼 wp231957
多谢指点,我会多思考多动手的。
语气什么的,如果你听着不舒服,我道歉,我只是觉得问个不懂的问题怎么就扯到质疑编程这么大的帽子了,一时犯二,别忘心里去。
2013-03-26 23:07
烈阳雨
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2013-3-19
收藏
得分:0 
回复 10楼 wp231957
厄,因为他讲到有一些特殊情况存在,这个时候浮点数是可以循环更新而不会出现差错的,我就在纳闷,是不是这就是特殊情况呢。。。
现在我的问题已经解决了,结论是浮点数也可以带入循环。
再次感谢您有耐心回答如此之基础的概念性问题。
2013-03-26 23:20
烈阳雨
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2013-3-19
收藏
得分:0 
回复 12楼 韶志
受教。
2013-03-26 23:38
快速回复:求教一下循环更新变量的问题,书上的答案和我学的概念有冲突
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021872 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved