我有一段代码如下:
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,然而,很明显是在小数部分足够的信息val1
是val2
可以被添加到它.
我很难过,有人有什么想法吗?
我相信我正在使用GCC 4.2.G ++是否使用IEEE四倍精度格式?或其他东西(比如80位扩展精度,这可以解释这个问题(虽然为什么会出现超过18个小数位呢?).
如果你的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
(因为加法产生的差异超出了二进制长双格式的表示范围)