添加long double会在C++中给出错误的答案

And*_*ott 2 c++ long-double

我有一段代码如下:

std::cerr << val1 << " " << val2 << std::endl;
val1 = val1 + val2;
std::cerr << val1 << std::endl;
Run Code Online (Sandbox Code Playgroud)

val1和val2都是长双.

问题来自于这样的结果:

-5.000000000000722771452063564190e-01 2.710505431213761085018632002175e-20
-5.000000000000722771452063564190e-01
Run Code Online (Sandbox Code Playgroud)

这没有意义.看来,VAL2没有被添加到VAL1,然而,很明显是在小数部分足够的信息val1val2可以被添加到它.

我很难过,有人有什么想法吗?

我相信我正在使用GCC 4.2.G ++是否使用IEEE四倍精度格式?或其他东西(比如80位扩展精度,这可以解释这个问题(虽然为什么会出现超过18个小数位呢?).

per*_*ain 5

如果你的val1和val2打印正确,那么输出是正确的: -

-5.000000000000722771452063564190e-01 = -5.000000000000722771452063564190 X e^(-1)  //or 10^(-1)
Run Code Online (Sandbox Code Playgroud)

哪里 ^ denotes to the power of

2.710505431213761085018632002175e-20 =  -5.000000000000722771452063564190 X e^(-20)  //or 10^(-20)
Run Code Online (Sandbox Code Playgroud)

..

Since val1 >> val2 
=> lim (val2/val1 -> 0) (lim is mathematical limit) .... eq (A)

Consider y=val1+val2
=> y= ((val1+val2)/val1)*val1  (rationalizing)
=> y= {(val1/val1)+(val2/val1)} * val1
=> y= {1+val2/val1}*val1
=> y= {1+0}*val1 .........................................From eq (A)
=> y= val1
Run Code Online (Sandbox Code Playgroud)

这就是输出的原因-5.000000000000722771452063564190e-01(因为加法产生的差异超出了二进制长双格式的表示范围)