【问题标题】:What's the meaning of precision digits in float / double / decimal? [duplicate]float / double / decimal 中的精度数字是什么意思? [复制]
【发布时间】:2021-05-02 20:02:03
【问题描述】:

C# reference for floating-point numeric types 上可以阅读

  • float 的精度为 6 到 9 位
  • double 的精度为 15 到 17 位
  • decimal 的精度为 28 到 29 位

precision 在这种情况下是什么意思,尤其是precision 怎么可能是一个范围?由于指数和尾数的位数是固定的,precision 如何可变(在所述范围内)?有人可以举个例子吗?一个floatprecision 为6,一个precision 为9?

【问题讨论】:

  • 您阅读过System.Double 的文档吗?
  • 我也将关闭该副本,但会添加 decimal 确实是浮点数。但是它是基数 10,而不是基数 2(如 float 和 double)
  • 这是有道理的。我会投票重新开放。在那里看到小数让我很失望,道歉。虽然十进制是浮点数,但它不是我们通常认为的浮点数(以 2 为底的浮点数)。然而,也许这是错误的骗局?如果之前没有回答,我会感到惊讶。
  • 我什至可以推荐wiki

标签: c# floating-point double ieee-754


【解决方案1】:

浮点型和双精度型

(我会解释float,即IEEE-754 Single-precision floating-point format,但double,即IEEE-754 Double-precision floating-point format是相同的,但数字更大。

一般而言,您可以将float 想象为:

尾数 2 * (2 ^ 指数 2)

其中尾数 2 表示以 2 为底的尾数,指数 2 表示以 2 为底的指数

尾数 2 为 23 位,指数 2 为 8 位。符号有一个额外的位,指数 2 有一个特殊的格式和特殊的范围,我们将在下面看到很多

还有一个技巧:浮点数通常以“规范化”的形式保存:

12 尾数 2 * (2 ^ 指数 2)

所以第一个数字始终是 12,所以尾数 2 是 12 加上 23 个二进制数,所以完整的尾数 2 总共有 24 位。

现在,使用 24 位,您可以有 0 到 16,777,216 之间的数字,即 7 个​​完整数字加上“部分”的第 8 个数字(例如,您不能有 26,777,216)。实际上 log₁₀ 2^24 = 7.22471989594

指数“移动”一个浮点小数点,这样你就可以有,例如

121212121212121212121212121212121212121212121212121212。 12(一共有24个二进制数字1,希望……我数过了)

1212121212121212121212121212121212121212121212121212。 1212

1212121212121212121212121212121212121212121212121212121202

121212121212121212121212121212121212121212121212121212120202

等等。

指数 2 具有三个范围:[-1;-127][1;127]0 用于非规范化数字,255 用于 NaN 和 Infinite(其中255 表示指数的所有位都在 1

[-1;-127] 范围内,小数点向左移动,步数等于范围,在[1;127] 范围内,小数点以相同方式向右移动。

如果指数是0,则数字是“非规范化”的。它们是丑陋的浮点数,具有特殊处理,因此速度较慢。当数字被“非规范化”时,数字的开头没有隐含的 12,所以你只有 23 位尾数,即 6 位精度的数字(log₁₀ 2^23 = 6.9236899)

无法解释 9 位精度是如何得出的。

十进制

使用decimal 很简单:格式为:

尾数 2 / (10 ^ 指数 2)

其中尾数 2 是 96 位,指数 2 是 5 位(稍微少一点,范围是 [0;28]),还有一个符号位和许多未使用的位。确切的格式写在reference source 中。在decimals 中没有隐含的初始 12,所以它是纯 96 位,而 log₁₀ 2^96 = 28.8988795837,所以是 28 或 29 位。

【讨论】:

    【解决方案2】:

    float/double/decimal中精度数字是什么意思?

    在文本和类型之间往返所需的十进制位。

    text-FP-text:当一个数字是十进制文本然后转换为浮点类型再转换回具有相同位数的文本并得到相同的值时,在FP类型的整个指数范围内,文本版本中有效小数位数的最大数量是较小的数字,例如 float 的 6。只要文本版本只有 6 位显示,float 就可以编码一个足够接近的值。

    FP-text-FP:当一个 FP 数字转换为十进制文本,然后再转换回 FP 并得到相同的 FP 值时,文本版本所需的有效十进制位数为较高的数字,如 9 表示 @ 987654325@。只要文本版本报告9+有效数字,就可以准确恢复原始FP值。

    float 有 24 位 二进制 进动。要将其转换为十进制,上述上下文很重要。最小的非零 double 大约需要 330+ 十进制 位才能准确打印出来,但这很少被认为是该数字的进动。


    有人可以举个例子吗?一个精度为 6 的浮点数和一个精度为 9 的浮点数?

    6 decimal digits always works .... "9999979e3" and "9999978e3" both convert to 9.999978e+09,因此往返需要 9 个有效文本数字。

    【讨论】:

      猜你喜欢
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      相关资源
      最近更新 更多