如何将大数字(例如 1.23e29)转换为 IEEE 754 单精度浮点格式?

How do I convert a big number (e.g. 1.23e29) to IEE 754 single-precision floating-point format?

我通过 here 学会了如何将十进制转换为 IEEE 754,但我不知道如何转换一个非常大的数字,而不必通过 [=15] 上解释的方法将其全部除尽=].

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

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

你不能简单地使用以 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. 求其正下方的 2 的次方
  3. 乘以 2 的所需尾数位数的幂,应用任何所需的舍入,然后右移指数。
  4. 通过添加偏差计算 IEEE 指数