【问题标题】:floating point values comparison failure [duplicate]浮点值比较失败[重复]
【发布时间】:2013-07-02 19:04:51
【问题描述】:

在C语言中,如果我们执行以下代码:

float a = 0.7;
if (a < 0.7)
{
    printf("Less");
}
else
{
    printf("no");
}

上面的代码打印出“Less”。

但是如果我们执行下面的代码:

float a = 1.7;
if (a < 1.7)
{
    printf("Less");
}
else
{
    printf("no");
} 

它打印“否”。

这是什么原因? float 数据类型是如何工作的?

【问题讨论】:

  • 您可能想要查找“浮点舍入错误” - 关于这些问题的大量文章 :-)
  • As you can see here,它在 C++11 中的打印也更少。请参阅 Luchian 的链接了解原因。
  • 如果你真的想比较浮动文字,请在其后添加 F,如 23.6F。
  • like= 100/3 = 33.3333...... 同样,当您将0.7 转换为二进制时,您将获得0,1 的无限(或长)序列,即原因是四字节 float .7f!= 八字节 double 0.7。请记住,无后缀的浮点文字是双精度的,舍入意味着即使是小的文本在舍入为浮点和双精度时也可以采用不同的值。

标签: c++ c


【解决方案1】:

float 数据类型适用于近似值。 C/C++ 中的每种数字数据类型都使用有限的、固定数量的字节来存储值。 float 以指数格式存储值,如果您将另一种格式的值传递给它,该值将被四舍五入......非零值。正如彼得亚历山大在回答中所说,1.7 不是“纯”浮点值。

对这种设计背后的动机的进一步详细解释可能太长,无法在此处找到答案 - 但如果您在谷歌上搜索,您可能会了解更多相关信息。其中一位评论者 Luchian 在那里留下了一个很好的链接:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

【讨论】:

    【解决方案2】:

    问题是afloat,但0.7double。分配给a 的值从double 转换为float,这会丢失精度。当您将adouble 进行比较时,a 扩大到double,但精度已经丢失,它们可能不再相等。

    如果您将0.71.7 更改为0.7f1.7f,那么它们将被转换为float,并且在这两种情况下都可以可靠地比较等于a

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 2023-04-05
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多