0

我认为是 GCC 编译的标准 C 代码中的一个微不足道的添加让我有些困惑。

如果我有一个称为 A 的双精度数,还有一个称为 B 的双精度数,并且 A = 一个非常小的指数,例如 1e-20,而 B 是一个较大的值,例如 1e-5 - 为什么我的双精度 C 等于 A+B 的总和在主导值 B 上?我希望当我指定打印到小数点后 25 位时,我会得到 1.00000000000000100000e-5。

相反,我得到的只是 1.00000000000000000000e-5。我必须使用 long double 还是其他东西?

非常困惑,我敢肯定,这是一个对大多数人来说很容易回答的问题!感谢您提前提供任何指导。

4

2 回答 2

1

是的,双尾数的精度不够。2^53(双尾数的精度)仅略大于 10^15(10^20 和 10^5 之间的比率),因此二进制扩展和舍入可以轻松压缩最后的小位。

http://en.wikipedia.org/wiki/Double-precision_floating-point_format

谷歌是你的朋友等等。

于 2012-11-09T14:10:12.210 回答
-1

浮点变量可以保持比定点更大的值范围,但是它们在有效数字上的精度有限制。
您可以表示非常大或非常小的数字,但精度取决于有效数字的数量。
如果您尝试根据用于表示它们的指数在数字之间进行非常远的运算,那么使用它们的能力取决于用相同指数表示它们的能力。
在您的情况下,当您尝试将两个数字相加时,较小的数字与较大的数字在指数上匹配,导致 0 因为其有效数字超出范围。您可以在wiki上了解更多信息

于 2012-11-09T14:19:20.230 回答