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

时间:2016-01-21 13:02:08

标签: 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。我是否需要将编译器开关设置为正确使用long double,或者这是编译器错误,还是什么?

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

X = fabsl(1.0) + 4.0*LDBL_EPSILON;

每个Bob的编辑2 __&#39的问题

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'后缀。我不知道为什么它有时会起作用,而不是其他人,但是,添加后缀似乎解决了我的问题。

谢谢鲍勃!

1 个答案:

答案 0 :(得分:2)

如果你想在计算中加倍,你应该使用long double后缀。

即。它应该是:

X = 1.0L + 4.0L * LDBL_EPSILON;

显然LDBL_EPSILON非常小,当加到1.0倍时,它会被切断。在某些编译器中,LDBL_EPSILON可能没有后缀定义,因此它不会强制计算以long double形式完成。