我有一个使用定点数的程序,因为我使用的CPU不支持IEEE754浮点数。
我一直都做得很好,首先通过找到指数将标准IEEE754s转换为固定点,然后通过手动访问内存中所述IEE754浮点数的位数来移位数字等。转换后,我可以进行定点计算。
但是,是否可以将固定点(例如Q15.16整数)重新构造为不带FPO的IEE754浮点,以便具有IEEE754 / FPO支持的CPU能够将其读取为其本机浮点类型?是否有任何代码或示例说明了CPU的FPO单元是如何在原始字节操作中实际进行此转换的,还是仅仅是一些无法在软件中完成的黑魔法?显然,我不是在寻找超精确转换。
我到目前为止看到的所有答案都使用FPO。例如,首先计算已经需要FPO的2 ^(-num_fraction_bits_in_fixed),然后将不动点缩放到该缩放因子。
在不失一般性的情况下,请考虑无符号定点数x
,假设(此处不失一般性)定点格式中的每个数字都是浮点格式的规范化float(由其表示):
1)找到前导零n
的数量(可能会有特殊的CPU指令来快速执行此操作,并且没有(软件)循环)。
2)将数字左移(y = x << n+1
)(以产生标准化的浮点尾数),然后右移(m = y >> (signbit+exponentbits)
),这是浮点数的尾数。
3)取n
,减去定点格式的非小数位数,再加上浮点格式的指数偏差。将有偏指数移到定点结果的指数位。
4)如果原始数字不是未签名的,则在数字为负的情况下在结果中设置符号位。
a)如果定点数字带有符号v
,则转换为不带符号的u
,并单独保留符号s
(您可以将其直接复制到浮点数字的符号位)。上面算法的无符号输入将是x = v < 0 ? -u : u
。
b)exponentbits
取决于浮点数格式。对于ieee754 32位float
,它是8
。
c)定点格式通常用n
位的整数表示数字,该整数(概念上)除以2^m
的常数。非小数位(如果存在)是n - m
和n > m
。
d)exponent bias
再次由浮点格式描述。对于ieee754 32位float
,偏差为127
。