如果明确给出指数和尾数,我知道如何从浮点二进制转换为十进制,但是这些例子呢:
0.11 = ? 0.101 = ?
我知道值是 75 和 625,但是转换过程是如何实现的呢?
要将某个分数f
(where 0 ≤ f < 1
) 转换为 base 中的数字序列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
。
请注意,该算法不关心计算机内部如何表示分数。它可以是二进制或三进制或六十进制;没关系。该算法转换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