关于C# reference for floating-point numeric types人们可以读到这一点
-
float
精度为 6 到 9 位 -
double
精度为 15 到 17 位 -
decimal
精度为 28 到 29 位
precision
是什么意思?在这种情况下,尤其是 precision
如何能是一个范围?由于指数和尾数的位数是固定的,那么precision
怎么能呢?是可变的(在所描述的范围内)?有人可以举个例子吗?一个float
与 precision
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/