我试图在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/