与十进制二进制数字类似,也可以表示浮点数。现在我读到它可以有那种浮动
0.5
:0.1
,0.25
:0.01
,0.125
:0.001
...依此类推。但是,例如,0.1(十进制)如何以二进制表示?
另外,给定十进制浮点数,如何将其转换为十进制等效值(假设它不是那么简单)。
编辑:所以我理解更好的问题是;如何将十进制浮点数转换为二进制?现在我得到它,我们乘以小数部分,直到它变为零。 现在很可能两个浮点可以具有相同的表示吗?
答案 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个零。)