我是C ++的新手!
https://github.com/sksamuel/sbt-scapegoat这个关于float
:最小正正常值是2 ^-126≈1.18×10 ^ -38,最小正(非正规)值是2 ^-149≈1.4×10 ^ -45。
但是如果一个浮点数最多可以有7位数(≈ 7.225
),那么最小值不只是0,0000001
吗?我很困惑:)
答案 0 :(得分:5)
浮点数由3部分组成:符号,分数和指数。这些都是整数,它们组合在一起得到一个实数: (-1)符号×(分数×2 -23 )×2 指数
维基百科文章使用带小数点的二进制数作为分数,但我发现将其视为整数乘以固定常数更清楚。在数学上它是一样的。
分数是23位,但是有一个额外的隐藏位使其成为24位值。可以用24位表示的最大整数是16777215,它只有7位十进制数。这定义了格式的精度。
指数是扩展数字的范围超出精度可以容纳的魔力。有8位用于保存指数,但其中一些值是特殊的。值255保留用于无穷大和非数字(NAN)表示,它们不是实数并且不遵循上面给出的公式。值0表示非正规范围,这被称为因为分数的隐藏位是0而不是1 - 它没有被标准化。在这种情况下,指数始终为-126
。请注意,非正规数的精度随着分数变小而下降,因为它的位数较少。对于所有其他位模式1-254,分数的隐藏位为1,指数为bits-127
。您可以在exponent encoding上的维基百科部分查看详细信息。
最小正正规数是(-1) 0 ×(1×2 -23 )×2 -126 ,或1.4 C-45。
最小的正归一化数是(-1) 0 ×(0x800000×2 -23 )×2 (1 - 127) ,或1.175494e-38。
答案 1 :(得分:-1)
必须区分内部表示和格式。
在内部表示中,浮点数通常从左到右打包为符号位,指数字段和有效数字或尾数。此表示是针对您提到的范围(数学限制)
定义的格式定义了"外部"表示并且限于可用空间,从而限于数据类型的精度,例如漂浮约7位数(技术限制)。