提问者:小点点

浮点数/双数/十进制中的精确数字是什么意思?[复制]


在浮点数字类型的C#参考中,可以看到

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

在这种情况下,精度意味着什么,尤其是,精度如何成为一个范围?由于指数和尾数的位数是固定的,精度如何(在所述范围内)是可变的?有人能举一个例子吗?例如,精度为6的浮点型,以及精度为9的浮点型


共2个答案

匿名用户

(我将解释float,即IEEE-754单精度浮点格式,但double,即IEEE-754双精度浮点格式相同,但数字较大。

一般来说,你可以想象一个float是:

尾数₂ * (2)指数₂)

尾数在哪里₂ 表示以二为底的尾数和指数₂ 指以二为底的指数

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

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

1.₂ 尾数₂ * (2)指数₂)

所以第一个数字总是1₂, 所以有一个1₂ 加上尾数的23位二进制数字₂, 所以完整尾数总共是24位₂.

现在,有了24位,你可以得到0到16777216之间的数字,也就是7个完整数字加上第8个“部分”(例如,你不能有26777216)。事实上₁₀ 2^24 = 7.22471989594

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

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·(总共有24个二进制数字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·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₂

等等

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

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

如果指数为0,则数字为“非规范化”。它们是丑陋的浮点数,具有特殊处理,因此速度较慢。当数字“非规范化”时,则不存在隐式1₂ 在数字的开头,所以你只有23位尾数,也就是6位精度(对数)₁₀ 2^23 = 6.9236899)

无法解释9位数的精度是怎么出来的。

使用decimal很简单:格式是:

尾数₂ / (10^指数₂)

其中尾数是96位,指数是5位(少一点,范围是[0; 28]),加上有一个符号位,还有很多不用的位,确切的格式写在参考来源中,在decimals中没有隐式的初始1,所以是纯96位,log2^96 = 28.8988795837,所以是28或29位。

匿名用户

浮点数/双数/十进制的精度数字是什么意思?

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

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

FP text FP:当一个FP数被转换成十进制文本,然后再转换回FP并获得相同的FP值时,文本版本所需的有效十进制位数是较高的数字,如9代表浮点。只要文本版本报告9位有效数字,就可以准确恢复原始FP值。

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

有人能举个例子吗,例如精度为6的浮点数和精度为9的浮点数?

6位小数总是有效的。。。。“999979E3”和“999978E3”都转换为9.999978e 09,因此往返需要9个有效文本数字。