与十进制类似,二进制数也可以表示浮点数。现在我读到它可以有这种类型的浮点
0.50.1,0.250.01,0.1250.001 ...诸若此类。但是,例如,0.1(十进制)是如何用二进制表示的呢?
此外,给定一个十进制浮点数,如何将其转换为十进制等效值(假设它不是那么简单)。
编辑:所以我理解更好的问题应该是:如何将十进制浮点数转换为二进制?现在我明白了,我们把小数部分相乘,直到它变成零。现在很有可能两个浮点可以有相同的表示,对吧?
发布于 2012-12-02 03:47:19
给定多少位?
0.1亿:
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.75radix 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?
发布于 2012-12-23 03:44:14
另一个可能有帮助的观察结果。浮点数的“整数部分”以其“正常”形式存在于二进制中,例如,如果值为25.7482,则浮点数中的位“11001”(25),后面的位表示小数(实际上第一个“1”从不存储,它隐含在格式中)。如果你从这个数字中减去25.0,再乘以10,得到7.482,通过检查这个值的整数部分,你可以得到第一个小数位'7‘。
减去7.0,乘以10得到4.82,因此下一个数字是'4',依此类推。从理论上讲,这个过程最终将以零结果结束,因为所有可以用浮点格式精确表示的值都具有精确的小数表示;然而,由于原始浮点的精度,“精确”结果的位数可能远远超过实际合理的位数(而且您可能需要内部额外的精度才能获得完全精确的结果--您需要确保乘以10不会产生舍入误差)。
而且,对于像6.432e-200这样的数字,这种方法是可行的,但效率不是很高(在第一个'6‘出现之前,你会生成199个零)。
https://stackoverflow.com/questions/13663026
复制相似问题