问题描述
假设我有一个二进制浮点符号(例如1001.011101),其浮点后的精度为2 ^(-n),那么如何将其转换为任何基数,例如三进制或十进制。
对于整数部分,有一个double dabble algorithm,使用它可以将二进制整数转换为任何基本系统。但是对于二进制浮点数,是否有类似的方法(只使用shift和add而不将其转换为十进制作为媒介。因为如果要先将其转换为十进制,足够大的精度N会导致溢出)?
解决方法
给出一个 n 位二进制数字,其中 m 位在小数/整数点之后,使用双浮点算法将该数字转换为BCD。在double dabble算法的原始位之后(右侧)包括一个额外的max(0,4 m - n 位)。将它们初始化为零。因此,双浮点算法完成后,BCD结果后将至少有4 m 个零位,为产生小数位提供了空间。
然后通过执行以下 m 次将其除以2 m :
- 对于每个奇数的BCD数字,从该数字的低位开始的五个位中减去6,然后进行到下一个低位。例如,xxx1 0000变为xxx0 1010,而xxx1 1001变为xxx10011。
- 将整个工作空间向右移一点。
这从本质上颠覆了double dabble算法:在下一个较高的数字都是奇数的地方,其低位相对于下一个较低的数字以二进制表示的16被调整为相对于下一个较低的数字为10,因此,当进行位移位后,具有所需的十进制效果。
如果4 m - n 为非负数,则结果将在各位中右移,以 m BCD表示一个数字小数点后的数字。如果4 m − n 为负,则结果从右边开始 n −4 m 位。>