了解 C 中的位级浮点乘法?

Understanding bit-level float multiplication in C?

我试图在 C 中实现 float_twice(float_bits x),它将 x 乘以 2 位级。 我比较了float_twice的结果和用C实现的真正的浮点乘法,发现了不同。

float_twice(0X800001) 产生 0X1000001,这对我来说似乎是正确的。据我了解,0X80001是指数1和小数部分1的浮点表示。由于是归一化值,我认为指数部分加1就足够了。

然而,((float) 0X800001) * 2.0 产生 0X1000002

这似乎是无符号整数的乘法,而不是浮点值。

总而言之,这些是我的问题,

  1. float_twice(0X800001) 的正确输出是什么?

  2. 如果正确的输出是0X1000001,为什么C计算((float) 0X800001) * 2.00X1000002

您的测试不正确:((float) 0X800001) 将整数值 0x800001 转换为最接近的 float 值,而不是具有相同位表示的 float

要检查您的结果,您必须执行类型双关,这可以通过 memcpy:

轻松完成
#include <stdint.h>
#include <string.h>

typedef uint32_t float_bits;

float_bits check_twice(float_bits x) {
    float f;
    float_bits r;
    memcpy(&f, &x, sizeof f);
    f *= 2;
    memcpy(&r, &f, sizeof r);
    return r;
}