我学会了如何从十进制转换为IEEE 754到here,但我不知道如何转换一个非常大的数字,而不必通过帖子中解释的方法将其全部分开。
例如,我必须将-1.5845632e29转换为IEEE 754单精度浮点数,是否有最简单的方法来获取此大数字的基数2?
答案 0 :(得分:1)
以下示例使用Python。请注意,这假设您对快速计算方法比对非常准确的答案更感兴趣。
你不能简单地在整个事情上使用log base 2,这只会给你一个明智的指数。然后,为了找到尾数,你可以将指数结果的小数部分拆分,然后再将两次幂提高,然后乘以2乘以尾数位的幂。标志需要单独处理。
以下产生指数(没有偏差)和尾数(1 + 23位,以十六进制显示):
math.log(1.5845632e29, 2)
96.99999995421683
hex(int(math.floor(2**0.99999995421683*2**23)))
'0xffffff'
要将它们全部组合起来,屏蔽隐含的一个尾数,移位指数+偏差,并取符号位:
hex((0xffffff & 0x7fffff) | ((96+127) << 23) | (1 << 31))
上述技术存在一些局限性 - 它不会捕获异常,并且可能存在准确性问题。请注意,对于较小的数字,您需要使用负分数来计算尾数。为了更精确地或针对不同的格式执行此操作,您可能必须在没有浮点数学函数的情况下完成所有操作。
如果您的工具或语言可以支持任意大整数,那么这项技术的粗略步骤很有效。这在Python中很容易,例如你需要特殊的库。