当前位置: 首页 > 知识库问答 >
问题:

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

齐乐逸
2023-03-14

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

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

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


共有2个答案

吴均
2023-03-14

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

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

文本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个有效文本数字。

全彬
2023-03-14

(我将解释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位。

 类似资料:
  • 问题内容: 如何确定整数位数和Java中类似数字的小数点后位数。 问题答案: 双精度并不总是精确的表示形式。您只能说如果将其转换为字符串,将有多少个小数位。 这仅适用于未转换为指数符号的数字。您可能会认为1.0小数点后一位或无位。

  • 本文向大家介绍C#浮点,双精度,十进制,包括了C#浮点,双精度,十进制的使用技巧和注意事项,需要的朋友参考一下 示例 浮动 float是.NET数据类型的别名System.Single。它允许存储IEEE 754单精度浮点数。存在此数据类型mscorlib.dll,每个C#项目在创建它们时都会隐式引用该数据类型。 大致范围:-3.4×10 38至3.4×10 38 十进制精度:6-9个有效数字 记

  • 问题内容: 与浮点变量一起使用时出现问题(向下舍入/截断精度部分)。如何正确执行? 游乐场:https : //play.golang.org/p/49TjJwwEdEJ 输出: 我期望的输出是的,但实际产量。 问题答案: 原始问题: Golang中的楼层号不正确 将Math.Floor与float变量一起使用时出现问题(向下舍入/截断精度部分)。我该怎么做呢? 我预计1980 * 0.1 / 1

  • 我是为了好玩而创作的,但我仍然想认真对待它,一个承载各种测试的网站。通过这些测试,我希望收集统计数据。 一些数据将包括测试完成时间的百分比。我可以很容易地计算测试的百分比,但我希望在存储关于完成测试的各种不同值时返回真实数据。 大多数值都是PHP浮点值,所以我的问题是,如果我想要真正的统计数据,我应该在MYSQL中以浮点、双精度或十进制的形式存储它们吗。 我想利用MYSQL的函数,比如和以及。为了

  • 二、浮点数转换成十进制数的步骤 该步骤与前面“十进制数转换成浮点数”的步骤是互逆的,其具体步骤如下: 1、分割数字的符号、阶码和有效数字; 2、将偏移阶码减去偏移,得到真正的阶码; 3、把数字写成规格化的二进制数形式; 4、把规格化的二进制数改变成非规格化的二进制数; 5、把非规格化的二进制数转换成十进制数。 例11.2 把协处理器中的浮点数1100000111001001000000000000

  • 问题内容: 我正在尝试将以下十六进制字符串转换为“ 41630D54FFF68872”到9988776.0(float-64)。 使用单精度float-32,我可以这样做: 但这会引发:java.lang.NumberFormatException:使用上面的64位十六进制时,Infinite或NaN。 如何将十六进制转换为使用64位IEEE-754编码的双精度浮点数? 谢谢 问题答案: 您需要双