如何用二进制表示浮点数。 IEEE

时间:2012-12-01 19:42:00

标签: floating-point binary decimal

与十进制二进制数字类似,也可以表示浮点数。现在我读到它可以有那种浮动

0.50.10.250.010.1250.001 ...依此类推。但是,例如,0.1(十进制)如何以二进制表示?

另外,给定十进制浮点数,如何将其转换为十进制等效值(假设它不是那么简单)。

编辑:所以我理解更好的问题是;如何将十进制浮点数转换为二进制?现在我得到它,我们乘以小数部分,直到它变为零。 现在很可能两个浮点可以具有相同的表示吗?

2 个答案:

答案 0 :(得分:3)

考虑多少位?

0.1B:

0.00011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011...

正如你所看到的那样,这是近似值。

Binary                                          Decimal
0.1     == 1/2^1         == 1/2              == 0.5
0.01    == 1/2^2         == 1/4              == 0.25
0.11    == 1/2^1 + 1/2^2 == 1/2 + 1/4 == 3/4 == 0.75

radix point后面的每一位代表1/2 ^(position_after_bit_string)。

postion:   |1|2|3|4|5|6|7|
         0.|0|0|0|0|0|0|1|

所以0.0000001 = 1/2^7 = 0.0078125

伪代码:

decimal_value = 0 
for i, bit in enumerate(binary_string):
    if bit == 1
         decimal_value += 1/2**i

了解更多信息Why can't decimal numbers be represented exactly in binary?

答案 1 :(得分:0)

另一个可能有用的观察结果。浮点数的“整数部分”以“正常”形式出现在二进制中,例如,如果值为25.7482,则浮点中的位为“11001”(25),后面的位表示分数(实际上第一个'1'从不存储,它隐含在格式中)。 如果从该数字中减去25.0并乘以10,则得到7.482,并通过检查该值的整数部分,您可以获得第一个小数位“7”。

减去7.0,乘以10得到4.82,因此下一个数字'4',依此类推。理论上,这个过程最终会以零结果结束,因为所有可以用浮点格式精确表示的值都具有精确的十进制表示。然而,考虑到原始浮点的精度,“精确”结果可能具有比实际合理数字更多的数字(并且您可能需要内部额外的精度来获得完全精确的结果,无论如何 - 您需要确保乘以10不会产生舍入误差。)

并且,对于像6.432e-200这样的数字,这种方法是可行的但效率不高(在第一个'6'出现之前你会生成199个零。)