我知道如果明确给出指数和尾数,如何将float二进制转换为十进制,但这些示例如何:
0.11 =? 0.101 =?
我知道值是75和625,但转换过程是如何实现的?
答案 0 :(得分:0)
要将某些分数f
(其中0 ≤ f < 1
)转换为基础B
中的数字序列,请执行以下算法:
mantissa = 0
exponent = 0
while f > 0 and exponent > minExponent:
p = f * B
i = floor(p)
f = p - i
mantissa = mantissa * B + i
exponent -= 1
minExponent
是一个限制输出大小的常量。 mantissa
和exponent
的最终值是mantissa * B^exponent == f
(原始f
)(在exponent >= minExponent
的约束下。
请注意,该算法并不关心计算机内部如何表示分数。它可以是二元或三元或sexagesimal;没关系。该算法将f
转换为整数,当除以B
的适当幂时,该整数等于f
。
另请注意,mantissa
需要能够存储与-minExponent
一样多的数字。这可能意味着您需要使用大整数库,具体取决于您的编程语言提供的内容。
这是一个完整的Python脚本,演示了算法:
from __future__ import division
from math import floor
def convert(f, B, minExponent):
mantissa = 0
exponent = 0
while f > 0 and exponent > minExponent:
p = f * B
integer = floor(p)
f = p - integer
mantissa = mantissa * B + integer
exponent -= 1
print "result = %d * %d^%d" % (mantissa, B, exponent)
convert(3/4, 10, -40)
convert(5/8, 10, -40)
convert(1/3, 10, -40)
这是输出:
result = 75 * 10^-2
result = 625 * 10^-3
result = 3333333333333333031620069604124830728192 * 10^-40