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

书上有道例题是求 (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
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:20 
“循环更新的变量不能定义为浮点型。”
这是谁说的啊
没做过实际测试  就不能乱说哦

DO IT YOURSELF !
2013-03-26 22:37
烈阳雨
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
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 3楼 烈阳雨
你说这些和循环变量以及循环步长是否为浮点型 有关系吗

难道你要质疑编译器的做法吗(至少编译是可以通过的)

DO IT YOURSELF !
2013-03-26 22:48
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
程序代码:
#include <stdio.h>
int main()
{ 
    double i;
    double sum=0.0;
    for(i=1.0;i<5.0;i+=0.1) sum+=i;
    printf("%.2f",sum);
    return 0;
} 
举个简单的例子 就可以证明循环变量可以为double型  循环步长也可以为double型

DO IT YOURSELF !
2013-03-26 22:54
烈阳雨
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
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用烈阳雨在2013-3-26 22:57:59的发言:

两个代码都成功运行了,得出的结果也相同,质疑编译什么的我没那水平,没那功夫,也没那心思。
我只是来请教一下为什么书上和老师讲的不一样,这是很明显的不同,而这个不同是否有其特殊性,或者说是我的理解错了还是这书和老师这二者有一方错了。
我并没有指责任何一方,这点请你注意,从始至终我都是抱着前来学习的态度。
你说话的语气很牛啊  

编译器能编译成功的代码  不就说明一切了吗  

尽信书 尽信老师  只能说明你自身有问题

DO IT YOURSELF !
2013-03-26 23:01
烈阳雨
Rank: 1
等 级:新手上路
帖 子:9
专家分:2
注 册:2013-3-19
收藏
得分:0 
回复 8楼 wp231957
多谢指点,我会多思考多动手的。
语气什么的,如果你听着不舒服,我道歉,我只是觉得问个不懂的问题怎么就扯到质疑编程这么大的帽子了,一时犯二,别忘心里去。
2013-03-26 23:07
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
我只是纳闷,明明都能编译并正确运行的代码  你还是要问那个郝啥来着的视频正确与否呢  如果他的是对的,那么你就不能编译并运行的  如果你还是认为郝啥来着讲的是对的,那只能认为你在质疑编译器,在那瞎编

DO IT YOURSELF !
2013-03-26 23:12
快速回复:求教一下循环更新变量的问题,书上的答案和我学的概念有冲突
数据加载中...
 
   



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

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