c++ 浮动的最小正值?

ubof19bj  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(104)

我是C++新手!
Wiki says关于float:最小正正规值为2^−126 <$1.18 × 10^−38,最小正(反正规)值为2^−149 <$1.4 × 10^−45。
但是如果一个浮点数可以有最大7位数(≈ 7.225),那么最小值不就是0,0000001吗?我很困惑:)

n53p2ov0

n53p2ov01#

浮点数由三部分组成:符号、分数和指数。这些都是整数,它们组合起来得到一个实数:(-1)符号×(分数× 2-23)× 2指数
维基百科上的文章使用了一个带有小数点的二进制数作为分数,但我发现把它想象成一个整数乘以一个固定常数会更清楚。数学上是一样的。
分数是23位,但有一个额外的隐藏位使其成为24位值。可以用24位表示的最大整数是16777215,它有7个十进制数字。这定义了格式的精度。
指数是一种魔法,它将数字的范围扩展到精度所能容纳的范围之外。有8位用于保存指数,但其中几个值是特殊的。值255是为无穷大和非A数(NAN)表示保留的,它们不是真实的数字,也不遵循上面给出的公式。值0表示非正规范围,之所以这样称呼是因为分数的隐藏位是0而不是1 -它没有正规化。在这种情况下,指数总是-126。请注意,反规范数的精度随着分数的减小而下降,因为它的位数更少。对于所有其他位模式1-254,分数的隐藏位为1,指数为bits-127。你可以在Wikipedia的指数编码部分看到细节。
最小的正反正规数是(-1 0 ×(1 × 2-23)× 2-126,或1.4e-45。
最小的正归一化数是(-1 0 ×(0x 800000 × 2-23)× 2(1 - 127),或1.175494e-38。

oxcyiej7

oxcyiej72#

必须区分内部表示和格式。
在内部表示中,浮点数通常从左到右打包为符号位、指数字段和有效数或尾数。此表示是针对您提到的范围(数学极限)定义的
该格式定义了“外部”表示,并受限于可用空间,从而受限于数据类型的精度,例如,浮动约7位数(技术限制)。

相关问题