我试图在C中实现float_twice(float_bits x),它将x乘以2的位级别。
我将float_的结果与用C语言实现的实际浮点乘法进行了两次比较,但发现两者之间存在差异。
float_twice(0X800001)产生0X1000001,这在我看来是正确的。据我所知,0X80001是指数1和分数部分1的浮点表示。因为它是一个标准化值,我相信在指数部分加一个就足够了。
然而,((float) 0X800001) * 2.0产生0X1000002
这似乎是无符号整数的乘法,而不是浮点值。
总之,这些是我的问题,
float_twice(0X800001)的正确输出是什么?
如果正确的输出是0X1000001,为什么C将((float) 0X800001) * 2.0计算为0X1000002

最佳答案

您的测试不正确:((float) 0X800001)将整数值0x800001转换为最接近的float值,而不是转换为具有相同位表示的float值。
要检查结果,必须执行类型punning,这可以通过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;
}

关于c - 了解C语言中的位级浮点乘法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57978253/

10-11 16:41