3

类似于十进制二进制数也可以表示浮点数。现在我读到它可以有那种花车

0.5: 0.1, 0.25: 0.01, 0.125: 0.001... 等等。但是,例如,0.1(十进制)如何以二进制表示?

此外,给定一个十进制浮点数,如何将其转换为十进制等效值,(鉴于它不是那么简单)。

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

4

2 回答 2

6

给定多少位?

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

小数点后的每一位代表 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

欲了解更多信息为什么不能用二进制精确表示十进制数?

于 2012-12-01T19:47:19.320 回答
0

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

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

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

于 2012-12-22T19:44:14.370 回答