【问题标题】:float and double constant comparing [duplicate]浮动和双常量比较[重复]
【发布时间】:2015-04-07 04:01:10
【问题描述】:

来自http://www.cprogramming.com/tips/tip/difference-between-float-and-double

在 c++ 中,任何像 4.12 这样的值都默认被视为双精度值。 比较浮点数和双精度数可能是一件棘手的事情,因为 精度差异导致微小误差。例如:

float a = 4.12;

if(a == 4.12)
{
    cout << "hello";
}
else
{
    cout << "bye";
}

这会将输出显示为“bye 4.12”

为什么?

因为默认情况下 4.12 是双精度数(例如在 if 语句中或 在对我们变量的赋值中),但是将它存储在一个浮点数中它会丢失 一些精度,所以比较然后比较一个双精度和浮点数 导致数字精度的微观变化——记住 浮动和双打并不精确。

这里有两个教训:一个是大多数时候不应该直接比较浮点数,另一个是硬编码浮点数的默认大小和类型是 double。

问题是'你不应该比较浮点变量和双常量'。

所以我的问题是比较浮点变量和浮点常量后跟“f”可以吗?

类似的东西。

if(a == 4.12f)

【问题讨论】:

  • 呃你有什么问题?
  • 您是否在询问将浮点常量与使用双常量初始化的浮点变量(除 f 外与浮点常量相同)进行比较是否总是等于?如果是这样,我认为这是一个合理的问题。
  • @samgak 是的,完全正确。对不起我的英语不好。

标签: c++ double equals-operator


【解决方案1】:

比较float变量和float常量后跟'f'可以吗?

还是很危险的。与您的float/double 示例不同,对于a 的每个可能值都可能失败,实际上a 的一个值a == 4.12f 将为true,但取决于您如何设置@ 987654328@ 它可能与 4.12f 不匹配,即使您期望它匹配。例如:

#include <iostream>
#include <iomanip>

int main()
{
    float f = 4.14;
    f -= 0.01;
    f -= 0.01;
    std::cout << std::boolalpha << (f == 4.12f) << '\n';
}

ideone.com here 上输出:

false

标准确实保证在某些情况下将使用最接近的表示,因此如果您直接分配float a = 4.12f;,那么之后a == 4.12f 必然是true,并且§ 26.5.1.4 保证如果您流出@ 987654335@ 并将文本流式传输回另一个 float,然后他们将比较等于。

无论如何,如果您觉得必须依赖这样的东西,请查看标准/文档以了解您正在考虑的具体用法。

【讨论】:

    猜你喜欢
    • 2013-03-12
    • 2016-05-10
    • 2012-10-26
    • 2011-10-24
    • 2010-09-06
    • 2020-06-13
    • 2023-04-05
    相关资源
    最近更新 更多