在浮点数字类型的C#参考中,可以看到
float
的精度为6到9位double
的精度为15到17位decimal
的精度为28到29位在这种情况下,精度
意味着什么,尤其是,精度
如何成为一个范围?由于指数和尾数的位数是固定的,精度如何(在所述范围内)是可变的?有人能举一个例子吗?例如,精度为6的
浮点型
,以及精度为9的
浮点型
?
浮点数/双数/十进制的精度数字是什么意思?
文本和类型之间往返所需的十进制数字。
文本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个有效文本数字。
(我将解释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]
),加上有一个符号位,还有很多不用的位,确切的格式写在参考来源中,在decimal
s中没有隐式的初始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编码的双精度浮点数? 谢谢 问题答案: 您需要双