LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2335|回复: 9

请问最合理的判断浮点数为零的语句。

[复制链接]
发表于 2010-1-16 22:04:17 | 显示全部楼层 |阅读模式
请教判断float(double)变量是否为零值的方法。
大家常用哪些方法,有何优缺点?
谢谢!
发表于 2010-2-22 19:38:08 | 显示全部楼层
浮点数好像不精确的判断为零
回复 支持 反对

使用道具 举报

发表于 2010-2-27 05:58:04 | 显示全部楼层
可以这样比较两个浮点

double a,b;
*(long long int*)&a > *(long long int*)&b
即先转成long long int然后比较对应整数的大小

同理
double a;
double b = 0.0;
*(long long int *)&a > *(long long int *)&b
比较a和0.0的大小
回复 支持 反对

使用道具 举报

发表于 2010-2-27 08:56:14 | 显示全部楼层
Post by zwithersir;2072025
可以这样比较两个浮点

double a,b;
*(long long int*)&a > *(long long int*)&b
即先转成long long int然后比较对应整数的大小

同理
double a;
double b = 0.0;
*(long long int *)&a > *(long long int *)&b
比较a和0.0的大小


不用强制类型转换而直接把IEEE浮点数二进制序列当成整数后再比较?这个办法还真是第一次见,不过刚才简单的验证了几个数好像是可以的.原理上说应该也是可行的
回复 支持 反对

使用道具 举报

发表于 2010-2-28 02:53:12 | 显示全部楼层
Post by liwangli;2072034
不用强制类型转换而直接把IEEE浮点数二进制序列当成整数后再比较?这个办法还真是第一次见,不过刚才简单的验证了几个数好像是可以的.原理上说应该也是可行的


The IEEE float and double were designed such that the numbers are "lexicographically ordered",
if a < b, *(long long int*)&a < *(long long int *)&b
or if f1, f2 are float, then
*(int *)&f1 < *(int *)&f2

可以参考这里:
http://www.cygnus-software.com/p ... comparingfloats.htm
回复 支持 反对

使用道具 举报

发表于 2010-2-28 17:12:20 | 显示全部楼层
Post by zwithersir;2072193
The IEEE float and double were designed such that the numbers are "lexicographically ordered",
if a < b, *(long long int*)&a < *(long long int *)&b
or if f1, f2 are float, then
*(int *)&f1 < *(int *)&f2

可以参考这里:
http://www.cygnus-software.com/p ... comparingfloats.htm
嗯,想一下IEEE浮点数的结构,指数域高位,小数域在低位,最后转成的整数肯定也同样具有大小之分了
回复 支持 反对

使用道具 举报

发表于 2010-3-9 21:32:40 | 显示全部楼层
当一个 浮点型的变量 小于一个阀值(依据机器的架构和位数)的时候,就认为他等于0
回复 支持 反对

使用道具 举报

发表于 2010-3-12 11:01:00 | 显示全部楼层
奇怪啊,在Ubuntu8.04
GCC 4.2.4版本
直接比较两个浮点数是否相等。是可以得到相等的结果的。


  1. int main()
  2. {
  3.     double a, b
  4.     printf("Please enter a:");
  5.     scanf("%lf", &a);
  6.     printf("Please enter b:");
  7.     scanf("%lf", &b);
  8.     printf("a=%f, b=%f\n", a, b);
  9.     if (a == b){
  10.         printf("a==b\n");
  11.     } else () {
  12.         printf("a!=b\n");
  13.     }   

  14. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-3-12 11:14:17 | 显示全部楼层
再次对上面的程序测试
当比较0.000...001和0.000.。0011时,到65个零都没有问题,能得到正确结果
当比较1.000..001和0.000.00011时,小数点后14个零时,就不能得到正确结果。

而用zwithersir的方法可以得到正确结果
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-24 14:58:38 | 显示全部楼层
Post by zwithersir;2072025
可以这样比较两个浮点

double a,b;
*(long long int*)&a > *(long long int*)&b
即先转成long long int然后比较对应整数的大小

同理
double a;
double b = 0.0;
*(long long int *)&a > *(long long int *)&b
比较a和0.0的大小


非常感谢!受启发。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表