浮点数问题

发布于 2022-10-15 10:15:21 字数 1674 浏览 75 评论 0

  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4.     double d1 = 1.00000000000000008;
  5.     double d2 = 1.00000000000000007;
  6.         if (d1 == d2)
  7.         {
  8.                 printf("相等\n");
  9.         }
  10.         else
  11.         {
  12.                 printf("不相等\n");
  13.         }
  14.     return 0;
  15. }

复制代码

  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4.     double d1 = 0.00000000000000008;
  5.     double d2 = 0.00000000000000007;
  6.         if (d1 == d2)
  7.         {
  8.                 printf("相等\n");
  9.         }
  10.         else
  11.         {
  12.                 printf("不相等\n");
  13.         }
  14.     return 0;
  15. }

复制代码0.00000000000000008
0.00000000000000007  

1.00000000000000008
1.00000000000000007

为什么两组数据相比结果不一样?

谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

枫以 2022-10-22 10:15:21

double好像只能存15位有效数字.所以1.00000000000000007 和1.00000000000000008被截断了存到变量中(这样说其实不是很准确,但估且这样理解).所以两者值是一样的.
到于0.00000000000000008和0.00000000000000007则不存在这个问题.

清风夜微凉 2022-10-22 10:15:21

本帖最后由 noword2k 于 2011-04-13 15:36 编辑

浮点数要这样比较是否相等:
if ( fabs(float1 - float2) < EPSLION )
{
....
}

EPSLION的define,看这里
http://en.wikipedia.org/wiki/Machine_epsilon

凡尘雨 2022-10-22 10:15:21

回复 1# shihyu

    double  占 8  byte.   是 64 bit.

最多 可以表示   2^64  个数字,也就 lg2 =0.3010   0.3010*64=19.264.

所以最多 可以表示不超过 10^20 个不同的数字,  其中 一部分用来表示 阶, 另一部分用来表示有效数字。

所以上边的, 因为位数多, 后边的位不在表示范围内

慵挽 2022-10-22 10:15:21

本帖最后由 shihyu 于 2011-04-15 15:22 编辑

0.00000000000000008
0.00000000000000007  

1.00000000000000008
1.00000000000000007

我不明白的是他们小数位都是一样但为什么比对结果不同?
两组小数位都是
00000000000000008
00000000000000007

0.00000000000000008
0.00000000000000007  
好像超过小数15~16有效位还是可以检查出来?

赏烟花じ飞满天 2022-10-22 10:15:21

回复 5# pmerofc

    如果还 64bit  的系统, sizeof(double)==16,  那上边的应该相等

握住我的手 2022-10-22 10:15:21

本帖最后由 shihyu 于 2011-04-15 16:30 编辑

#include <stdio.h>

int main(int argc, char *argv[])
{
    float d1 = 0.000000000000000000000000000000001;
    float d2 = 0.000000000000000000000000000000008;

        if (d1 == d2)
        {
                printf("相等\n");
        }
        else
        {
                printf("不相等\n");
        }

    return 0;
}

一样出现不相等 float 有效位应该只有 5~6位吧

深白境迁sunset 2022-10-22 10:15:21

回复  pmerofc

    如果还 64bit  的系统, sizeof(double)==16,  那上边的应该相等
goldenfort 发表于 2011-04-15 15:21

    哪个编译器是这样的?{:3_184:}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文