这是我的代码。为什么我的第一行代码不能正常工作?
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/