如果双精度不能容纳尽可能多的有效数字,那么双精度如何表示比小数更高的数字?

How can doubles represent higher numbers than decimals if they can't hold as many significant figures?

我可能对重要数字没有正确的理解,但是这本书

C# 6.0 in a Nutshell by Joseph Albahari and Ben Albahari (O’Reilly).

Copyright 2016 Joseph Albahari and Ben Albahari, 978-1-491-92706-9.

提供下面的 table 用于比较 doubledecimal:

一方面,double 可以容纳较少数量的 重要数字 ,而另一方面,它可以表示比十进制,可以容纳更多的有效数字 ?

范围与精度无关。 Double 具有二进制表示(基数 2)。并非所有数字都可以完全按照我们人类所知道的十进制格式来表示。更不用说加法和除法的累积舍入误差了。较大的范围意味着比十进制更大的 MAX VALUE 和更小的 MIN VALUE。

另一边的十进制是(以 10 为底)。它具有较小的范围(较小的 MAX VALUE 和较大的 MIN VALUE)。这与精度无关,因为它不使用浮点二进制小数点表示法表示,它可以更精确地表示数字,但建议用于人造数字和计算。

答案在于双打的编码方式。它们不仅是数字的直接二进制表示,还包含 3 个部分:符号、指数和分数。

  • 符号很明显,控制+或-。

  • 小数部分也很明显。它是二进制小数,表示 0 和 1 之间的数字。

  • 指数是魔法发生的地方。它表示比例因子。

最后的float计算出来就是(-1)^$sign * (1 + $fraction) * 2 ^$exponent

由于指数的缘故,这允许比直接十进制数高得多的值。有很多关于为什么这有效以及如何对这些编码数字进行加法和乘法的读物。 Google 围绕 "IEEE floating point format" 或您需要的任何主题。希望对您有所帮助!

假设您被告知可以存储一个值,但有一个限制:您只能存储 10 位数字、0-9 和一个负号。您可以创建规则来解码值,因此您可以存储任何值。

第一种存储方式就是简单地存储值 xxxxxxxxxx,这意味着数字 123 存储为 0000000123。易于存储和读取。这就是 int 的工作原理。

现在您决定要存储小数,因此稍微更改一下规则。现在你存储 xxxxxxyyyy,其中 x 是整数部分,y 是小数部分。因此,123.98 将存储为 0001239800。这大致就是 Decimal 值的工作原理。您可以看到我可以存储的最大值是 9999999999,转换为 999999.9999。这意味着我对值的大小有一个硬性上限,但有效数字的数量很大,为 10。

有一种方法可以存储更大的值,那就是将公式x*10^y的x和y分量存储在xxxxxxyyyy中。所以,要存储123.98,你需要存储01239800-2,我可以计算为12398*10^-2。这意味着我可以通过更改 'y' 来存储更大的数字,但有效数字的数量基本上固定为 6。这基本上就是 double 的工作方式。