c# - float/double/decimal 中的精度数字是什么意思?

标签 c# floating-point double ieee-754

关于C# reference for floating-point numeric types人们可以读到这一点

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

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

最佳答案

float 和 double

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

一般来说,您可以将 float 想象为:

mantissa₂ * (2 ^ exponent₂)

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

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

还有另一个技巧:浮点通常以“标准化”形式保存:

1₂ mantissa₂ * (2 ^ exponent₂)

因此第一个数字始终是 12,因此有 12 加 23 个二进制数字作为尾数 2,因此完整的尾数 2 总共有 24 位数字。

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

指数“移动”一个 float 小数点,这样你就可以得到,例如

1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂ . 1₂ (there are a total of 24 binary digits 1, I hope... I counted them)

1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂ . 1₂1₂

1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂0₂

1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂1₂0₂0₂

等等。

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

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

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

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

十进制

decimal这很简单:格式是:

mantissa₂ / (10 ^ exponent₂)

其中尾数 2 为 96 位,指数 2 为 5 位(少一点,范围为 [0;28]),另外还有一个符号位,以及许多未使用的位。具体格式写在 reference source 。在十进制中,没有隐含的初始12,因此它是纯96位,并且log₁₀ 2^96 = 28.8988795837,因此28或29位数字。

关于c# - float/double/decimal 中的精度数字是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65945356/

相关文章:

c# - nunit 2.6 可以与 resharper 6.1.1 一起运行吗?

c++ - 用于高级综合的任意精度浮点库

python - 使用整数的 Numpy 点积非常慢

java - 如何输出小数点后20位的Double?

c++在2个 double 之间生成一个 double

java - 四舍五入 - 几十

C# 数组内容不显示,但类型是

c# - TextBlock 内联上的 WPF 触发器

c# - 如何在 Window 启动 C# 时将 wpf 应用程序移动到最小化托盘?

mysql - 如何在 MySQL 中存储平均评分?