0

我通过这里学习了如何从十进制转换为 IEEE 754 ,但我不知道如何转换一个非常大的数字,而不必通过帖子中解释的方法将其全部除。

例如,我必须将 -1.5845632e29 转换为 IEEE 754 单精度浮点,有没有比获取这个大数的 log base 2 更简单的方法?

4

1 回答 1

1

下面的示例使用 Python。请注意,这假设您对快速计算方法比非常准确的答案更感兴趣。

你不能简单地在整个事情上使用 log base 2,这只会给你一个合理的指数。然后要找到尾数,您可以拆分指数结果的小数部分并再次提高 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 中很容易,例如 C,您需要特殊的库。

  1. 将数字写为实际值的大整数
  2. 在它下面找到两个的幂
  3. 将所需的尾数位数乘以 2,应用任何所需的舍入,然后右移指数。
  4. 通过添加偏差计算 IEEE 指数
于 2016-10-06T13:16:37.277 回答