这是我的代码。为什么我的第一行代码没有正常工作?
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'后缀。我不知道为什么它有时会起作用,而不是其他人,但是,添加后缀似乎解决了我的问题。
谢谢鲍勃!
答案 0 :(得分:2)
如果你想在计算中加倍,你应该使用long double后缀。
即。它应该是:
X = 1.0L + 4.0L * LDBL_EPSILON;
显然LDBL_EPSILON非常小,当加到1.0倍时,它会被切断。在某些编译器中,LDBL_EPSILON可能没有后缀定义,因此它不会强制计算以long double形式完成。