| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2366 人关注过本帖
标题:[讨论]一个很有趣的程序
只看楼主 加入收藏
abingchem
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:716
专家分:0
注 册:2004-12-30
收藏
 问题点数:0 回复次数:7 
[讨论]一个很有趣的程序

一个很简单的程序是:

#include <stdio.h>
#incude <conio.h>
void main()
{
float one,two=-1;
for(one=0;one!=two;one++)two=one;
clrscr();
printf("stop at : %f",one);
}
上面的程序就是检测浮点数误差,某一个足够大的浮点数加一后本身并没有改变,即大数吃小数

但有趣的是,程序还可以这样写:
#include <whole.h>
void main()
{
float one;
one=0;
for(;one==++one;);
clrscr();
printf("stop at : %f",one);
}

两个程序的结果都是 :one=16777216.000000
第一个程序很容易理解,但第二个就很难理解,表达式似乎记过成立哟

注:以上程序在tc2.0下编译通过

[此贴子已经被作者于2005-1-13 14:41:41编辑过]


搜索更多相关主题的帖子: 检测 include 
2005-01-12 15:23
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
你对这两个程序运行的结果的解理是错误的,“某一个足够大的浮点数加一后本身并没有改变”,必须明确是改变的,浮点的大小比较不能直接>,<,==,>=,<=,具体请查看浮点的存储方式及林锐博士的论文。

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-01-12 19:59
abingchem
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:716
专家分:0
注 册:2004-12-30
收藏
得分:0 
但是在科学计算当中,这样的情况是常常遇到的,没有办法不处理
浮点不能比较大小,那平常编程里面怎么可以呢?不要说是编译器自己处理的
浮点数不能是零比较,浮点数本身怎么不能比较呢?请楼上说明,正好长见识喽

而且,我说的,“某一个足够大的浮点数加一后本身并没有改变”,在编程当中是可以发生的,就是当数字1已经不能影响到被加数的有效位数时,加一等于加零

此人已消失
2005-01-13 14:46
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 


我犯错误了,误解你的意思了,收回楼上的话,给点面子吗

不过,浮点数在某种精度要求下是不能直接比大小,两个浮点数的比较必须用abs(Var1-Var2)和一个很小的数比较的形式。

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-01-14 22:07
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
10. 条件语句 10.1 是否使用==对一个浮点数进行判断? 如: if (someVar == 0.1),应该使用相减,然后>, >=, <, <=, if (abs(someVar – 0.1) <= eps),eps很小,1e-6等。 摘自 http://bbs.bc-cn.net/bbs/dispbbs.asp?boardID=5&ID=11156&page=1

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-01-14 22:52
abingchem
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:716
专家分:0
注 册:2004-12-30
收藏
得分:0 
knocker很专业嘛,偶喜欢
在一般的数值中,好像都会采用你说的第二种方法。

不过,偶发现大家没有注意到,第二个程序很值得玩味:
#include &lt;whole.h&gt;
void main()
{
float one;
one=0;
for(;one==++one;);
clrscr();
printf("stop at : %f",one);
}
这个程序在TURBOC2.0中可以运行,但是在其他的编译器中大多数都有问题的,就是,one==++one,似乎应该永远成立,或者永远不成立,可是就是有那么一个值可以使程序完成,呵呵

此人已消失
2005-01-15 09:19
gvtbs
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2004-9-6
收藏
得分:0 
楼上的哥哥你的程序你自己运行过吗???
为什么我远行了你的程序好说死了!!!1
2005-01-15 10:40
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
以下是引用abingchem在2005-1-15 9:19:23的发言: knocker很专业嘛,偶喜欢 在一般的数值中,好像都会采用你说的第二种方法。 不过,偶发现大家没有注意到,第二个程序很值得玩味: #include <whole.h> void main() { float one; one=0; for(;one==++one;); clrscr(); printf("stop at : %f",one); } 这个程序在TURBOC2.0中可以运行,但是在其他的编译器中大多数都有问题的,就是,one==++one,似乎应该永远成立,或者永远不成立,可是就是有那么一个值可以使程序完成,呵呵
这是因为不同的编译器对one==++one有不同的解释,关闭编译器的优化选项再试试。

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-01-15 20:19
快速回复:[讨论]一个很有趣的程序
数据加载中...
 
   



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

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