【问题标题】:How can doubles represent higher numbers than decimals if they can't hold as many significant figures?如果双精度数不能容纳尽可能多的有效数字,它们怎么能代表比小数更高的数字呢?
【发布时间】:2016-07-17 16:41:16
【问题描述】:

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

Joseph Albahari 和 Ben Albahari (O'Reilly) 的 C# 6.0 简述。

版权所有 2016 Joseph Albahari 和 Ben Albahari,978-1-491-92706-9。

提供下表比较doubledecimal

一方面,double 可以容纳较少的有效数字,而另一方面,它可以表示比十进制大得多的数字,这不是违反直觉的吗?更多重要数字

【问题讨论】:

  • 不是每个可以用decimal 表示的值都可以用double 表示。
  • 但是,一个能够表示非常大的数字的范围怎么能说比其他能够表示更小的数字的范围更小?我的意思是,只有当答案,就像你之前暗示的那样,在于 double 与更简洁的数字序列相关 - 以及一个标志或任何其他表示它包含多少次确定的给定数字的事实,比如 N跨度>

标签: c# clr primitive-types


【解决方案1】:

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

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

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

有一种方法可以存储更大的值,那就是将公式 的x 和y 分量存储在xxxxxxyyyy 中。因此,要存储 123.98,您需要存储 01239800-2,我可以将其计算为 。这意味着我可以通过更改“y”来存储更大的数字,但有效位数基本上固定为 6。这基本上是 double 的工作原理。

【讨论】:

  • 谢谢匿名。你不是说 which I can calculate as 12398*10^-4 中的 12398 * 10-2 吗?
  • 最后一句话 :) - So, 123.98 would be stored as 0001239800 - 不应该是 00012398 吗?
  • 不。我想象的以 10 为底的十进制格式允许 4 个小数位,因此它需要存储所有 4 个数字,即使该数字只需要其中的 2 个。
【解决方案2】:

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

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

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

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

最终的浮点计算结果为 (-1)^$sign * (1 + $fraction) * 2 ^$exponent

由于指数,这允许比直接十进制数更高的值。那里有很多关于为什么这样做以及如何使用这些编码数字进行加法和乘法的阅读。谷歌搜索“IEEE 浮点格式”或您需要的任何主题。希望对您有所帮助!

【讨论】:

  • 嗯...我们开始吧,答案似乎在于指数trick
  • 刚刚意识到我的公式有问题。现在修好了。但是,是的,你可以得到一些疯狂的高数字,因为 64 位双精度只是逻辑值的物理编码,而不是物理值的 64 位直接编码。
【解决方案3】:

范围与精度无关。 Double 具有二进制表示形式(以 2 为基数)。并非所有数字都可以像我们人类所知的十进制格式一样精确地表示。更不用说加法和除法的累积舍入误差。与十进制相比,更大的范围意味着更大的 MAX VALUE 和更小的 MIN VALUE。

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

【讨论】:

  • 你触及了一些有趣的点,但你没有解决问题背后的问题:如果一个数字有更多的有效数字(让我们称它们为小数点前的有效数字(不包括前导零),如何它可以比另一个不能表示尽可能多的有效数字的更小吗?
猜你喜欢
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 2017-01-10
  • 2018-12-23
  • 2017-01-01
  • 2013-06-14
  • 1970-01-01
  • 2015-05-17
相关资源
最近更新 更多