零度天空

C++博客 首页 新随笔 联系 聚合 管理
  3 Posts :: 0 Stories :: 6 Comments :: 0 Trackbacks

怎么样判断两个浮点数精确相等?一般来说是两个数差的绝对值和一个极小值比较,如果小于这个极小就,就认为是相等。

前两天在LinuxSir上看到一个贴子,讨论这个问题,发现可以精确比较相等。

代码如下:

#include <stdio.h>
#include 
<stdlib.h>

int main()
{
    
double a, b;
    printf(
"please enter a number:");
    scanf(
"%lf"&a);

    printf(
"please enter b number:");
    scanf(
"%lf"&b);

    printf(
"Input number is a=%f, b=%f\n", a, b);

  
if (*(long long int *)&== *(long long int *)&b) {
        printf(
"a == b\n");
   }
 else {
        printf(
"a != b\n");
    }


    
return 0;
}


 发现用这种方法在Ubuntu8.04,GCC4.24的情况下通过。不过这种方法个人感觉只能用来比较一个程序内部生成的浮点数的运算。

如果两个浮点数是由两台不同平台的机器运行的程序生成,或者不同编译器生成的程序运行产生,则可能根据无法得到相等的结果。

因现在只有x86的机器,谁手上有ARM平台之类的,请帮忙测试一下。谢谢


当直接用==比较两个浮点数时,随着整数部分增加,精度急剧下降

当比较0.000...001和0.000.。0011时,到65个零都没有问题,能得到正确结果
当比较1.000..001和0.000.00011时,小数点后14个零时,就不能得到正确结果。

 

posted on 2010-03-12 13:00 绝对零度 阅读(3931) 评论(3)  编辑 收藏 引用 所属分类: C++

Feedback

# re: 如何精确判断两个浮点数相等 2010-03-12 17:41 陈梓瀚(vczh)
直接用==也是精确比较的- -b除非两边有一个浮点数刚好是“非法格式”,譬如NaN或者越界了  回复  更多评论
  

# re: 如何精确判断两个浮点数相等 2010-03-14 09:47 绝对零度
@陈梓瀚(vczh)
直接==比较精度不够,
当比较0.000...001和0.000.。0011时,到65个零都没有问题,能得到正确结果
当比较1.000..001和0.000.00011时,小数点后14个零时,就不能得到正确结果。  回复  更多评论
  

# re: 如何精确判断两个浮点数相等 2010-05-08 20:08 wuhaifeng
@绝对零度:你这个只能针对两个都输入常数的类型,看它们是否指向同一个地址,如果数字运算几次,就不行了。
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理