c++ - 为什么我不能将 LDBL_EPSILON 添加到 1

标签 c++ c++builder

这是我的代码。为什么我的第一行代码不能正常工作?

long double X;
X = 1.0 + 4.0*LDBL_EPSILON;                // The result is always 1.0
X = (long double)1.0 + 4.0*LDBL_EPSILON;   // Gives the correct result sometimes.

X = LDBL_EPSILON;
X += 1.0;          // These 2 lines seem to always give the correct result.

上面提到的不稳定行为会在构建之间发生变化,而不会对此特定代码进行任何更改。我正在使用 C++ Builder XE3。我是否需要设置编译器开关以正确使用长 double ,或者这是一个编译器错误,还是什么?

编辑:我尝试使用这行代码,它似乎总是有效。

X = fabsl(1.0) + 4.0*LDBL_EPSILON;

根据 Bob__ 的问题编辑 2

long double X;
const long double epsilon = 1.084202172485504434E-19;
X = 1.0 + 14.0*epsilon;   // This result is correct

但是如果我在代码行中用 LDBL_EPSILON 替换 epsilon,我可以很容易地重现这个问题。

Edit3:在 Bob__ 的帮助下,我发现我对 LDBL_EPSILON 的定义没有“L”后缀。我不知道为什么它有时会起作用,而其他的则不起作用,但是尽管如此,添加后缀似乎已经解决了我的问题。

谢谢鲍勃!

最佳答案

如果要在计算中使用long double,则应使用long double后缀。

即应该是:

X = 1.0L + 4.0L * LDBL_EPSILON;

显然 LDBL_EPSILON 非常小,以至于当添加到 1.0 double 时,它​​被截断了。在某些编译器上,LDBL_EPSILON 的定义可能没有后缀,因此它不会强制在 long double 中完成计算。

关于c++ - 为什么我不能将 LDBL_EPSILON 添加到 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34924598/

相关文章:

c++ - 使用冒泡排序对类中的 2D Char 和 Int 数组进行排序?

c++ - "launching ' 项目 ' has encountered ..",项目文件不存在

c++ - 指向 const 成员变量的指针

c++ - 如何在 Visual Studio 2010 中使用 C++(使用非托管代码)创建分步向导

c++ - 如何混合 std::stream 和 Delphi TStream?

c++ - 如何在 C++ Builder 中设置 C++ 语言标准

C++ 写 int 缓冲区

delphi - 在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2

dll - dll文件中的C++ Builder函数错误[bcc32-歧义错误]

c++ - 如何从监视列表中隐藏一些类公共(public)属性?