【问题标题】:constructing a float from sign mantissa and exponent从符号尾数和指数构造一个浮点数
【发布时间】:2015-05-31 20:27:12
【问题描述】:

有没有办法在给定其组件(无符号整数)的情况下构建任何浮点数?

我注意到 math.h 中的 ldexp 执行尾数 * 2^exponent 但这对某些十进制值没有帮助,例如 0.25,其表示为

0 01111101 00000000000000000000000

尾数为 0,因此 ldexp 将返回 0 而不是 0.25。有没有办法解决这个问题?

编辑:考虑到隐藏位,尾数和指数的实际值是多少? IE。 - 哪些值会被输入 ldexpf?

【问题讨论】:

  • 假设你的变量是unsigned int x,你可以打破严格的别名规则并初始化变量float f = *((float*)&x)。只需确保您的平台上有sizeof(unsigned int) == sizeof(float)
  • 你最后的结论是错误的。尾数比存储的值长一位。所谓的隐藏位是一个隐含的1,你忽略了它,并错误地得出结论,尾数是0。
  • 顺便说一句,函数ldexp 用于double(8 个字节),函数ldexpf 用于float(4 个字节)。在 float 操作数上使用函数 ldexp 可能是您遇到问题的根源。
  • 隐含的1 不存储在内存中。它在位 22 和 23 之间。参见IEEE 754: Representation and encoding in memory: "特别是在正常范围内,有效数的前导位非零,因此始终为 1。因此,该前导位 ​​1正常数字不需要在内存编码中表示。”

标签: c++ floating-point


【解决方案1】:

这取决于您机器上的浮点编码。一个常见的是IEEE754,如果你看一下你就可以知道这个任务。无论如何请记住,这取决于平台。

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 2018-01-12
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2020-12-20
    • 2018-09-23
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多