【发布时间】: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