类似于十进制二进制数也可以表示浮点数。现在我读到它可以有那种花车
0.5
: 0.1
, 0.25
: 0.01
, 0.125
: 0.001
... 等等。但是,例如,0.1(十进制)如何以二进制表示?
此外,给定一个十进制浮点数,如何将其转换为十进制等效值,(鉴于它不是那么简单)。
编辑:所以我知道更好的问题是;如何将十进制浮点数转换为二进制?现在我知道我们乘以小数部分,直到它变为零。现在很有可能两个浮点可以具有相同的表示,对吗?
类似于十进制二进制数也可以表示浮点数。现在我读到它可以有那种花车
0.5
: 0.1
, 0.25
: 0.01
, 0.125
: 0.001
... 等等。但是,例如,0.1(十进制)如何以二进制表示?
此外,给定一个十进制浮点数,如何将其转换为十进制等效值,(鉴于它不是那么简单)。
编辑:所以我知道更好的问题是;如何将十进制浮点数转换为二进制?现在我知道我们乘以小数部分,直到它变为零。现在很有可能两个浮点可以具有相同的表示,对吗?
给定多少位?
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
欲了解更多信息为什么不能用二进制精确表示十进制数?
另一个可能有帮助的观察结果。浮点数的“整数部分”以“正常”形式存在于二进制文件中,例如,如果值为 25.7482,则浮点数中将包含位“11001”(25),后面的位表示分数(实际上第一个'1'从未存储,它在格式中隐含)。如果从该数字中减去 25.0,再乘以 10,则得到 7.482,通过检查该值的整数部分,可以得到第一个小数位“7”。
减去 7.0,乘以 10 得到 4.82 ,因此下一个数字“4”,依此类推。这个过程理论上最终会以零结果结束,因为所有可以用浮点格式精确表示的值都有精确的十进制表示;但是,考虑到原始浮点的精度,“精确”结果的位数可能比实际合理的多得多(无论如何,您可能需要额外的内部精度才能获得完全精确的结果 - 您需要确保乘以 10 确实不会产生舍入误差)。
而且,对于像 6.432e-200 这样的数字,这种方法是可行的,但效率不高(在第一个 '6' 出现之前你会生成 199 个零)。