【问题标题】:C++ Floating point precision error compiler flagC++ 浮点精度错误编译器标志
【发布时间】:2022-12-18 03:19:27
【问题描述】:

在 C++ 中,是否有一个编译器标志或某个选项使它成为这样,如果 2 个浮点数在浮点运算的误差范围内,它们被评估为相等?

必须追踪浮点错误很烦人。 例如,很久以前,在测试我知道值是什么的东西时,我什至覆盖了该行之前的值,但它仍然失败。 这是一个非常简化的版本

double x = 3;
if(x == 3)
   printf("x is 3");
else
   printf("x is not 3");

然后进入 else 案例并打印“x is not 3”

必须有一种方法来处理这个问题,这并不意味着我必须为每个浮点比较添加处理。

【问题讨论】:

  • 对不起,没有,没有这样的标志。
  • 所以,您正在寻找一个标志,告诉编译器两个浮点数应该比较相等,即使它们不相等?用浮点数学计算的结果和用实数计算的结果之间的差异是无法准确确定的;如果是这样,就不会有“浮点错误”的概念。请记住,浮点数学并不遵循您一生中学到的关于数字如何工作的规则。这并没有错,就像int x = 1/3; if (x * 3 != 1) /* something is wrong */一样。

标签: c++ floating-point


【解决方案1】:

如果你使用 GCC 和 glibc,你可以包含类似的东西

#define _GNU_SOURCE 1
#include 
static void __attribute__ ((constructor))
trapfpe ()
{
    /* Enable some exceptions.  At startup all exceptions are masked.  */

    feenableexcept (FE_INEXACT);
}

在您的项目中,当它遇到上述 FP 异常之一时,它将中止程序(如果您在您的环境中启用了核心转储,则使用核心转储)。

话虽如此,我认为 FE_INEXACT 在现实中并不是特别有用。一个有点有用的组合可能是FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW(但这是在被问到的问题之外)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多