C和C ++编译器如何实现浮点数相等的决策?

时间:2015-05-06 03:46:11

标签: c++ c floating-point-precision

例如,

float a = 1.0;
float b = 1.2;

puts(a == b? "equal": "not equal");

编译器是按位还是通过其他方法处理它?<​​/ p>

(我知道&#34; ==&#34;决定浮点数的相等性不是一个好的选择,我只是想知道编译器如何处理这种情况。)

3 个答案:

答案 0 :(得分:5)

一般的,完整的答案是根据IEEE 754规范比较浮点数。

要具体回答您的问题,大多数情况下,两个浮点数按位进行比较,只有少数例外情况:

  • 正零和负零被视为相等
  • NaN被认为是不平等的,甚至对NaN本身而言
  • 在某些操作模式下, 可以 比较等于零和其他次正规(例如“将次正常冲洗为零”)
  • 除了这些例外,使用常规的按位比较

答案 1 :(得分:3)

gcc和clang使用UCOMISS x86 / x64指令。

来源:tried it-O3并检查了程序集输出。

答案 2 :(得分:1)

我假设你的意思是在程序编译之后,它如何比较两个浮点数。存储浮动的方式非常独特。它由符号,指数和分数存储,如here所示。因此,除非它绝对平等,否则程序甚至会看到1和1.000000000001不同。要检查它们是否几乎相等,您可以使用以下内容:

bool AlmostEqualRelativeOrAbsolute(float A, float B,
            float maxRelativeError, float maxAbsoluteError)
{
    if (fabs(A - B) < maxAbsoluteError)
        return true;
    float relativeError;
    if (fabs(B) > fabs(A))
        relativeError = fabs((A - B) / B);
    else
        relativeError = fabs((A - B) / A);
    if (relativeError <= maxRelativeError)
        return true;
    return false;
}

代码来自here,您可能希望在网站上阅读更多内容。