了解 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
。
这似乎是无符号整数的乘法,而不是浮点值。
总而言之,这些是我的问题,
float_twice(0X800001)
的正确输出是什么?
如果正确的输出是0X1000001
,为什么C计算((float) 0X800001) * 2.0
是0X1000002
?
您的测试不正确:((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;
}
我试图在 C 中实现 float_twice(float_bits x)
,它将 x
乘以 2 位级。
我比较了float_twice的结果和用C实现的真正的浮点乘法,发现了不同。
float_twice(0X800001)
产生 0X1000001
,这对我来说似乎是正确的。据我了解,0X80001
是指数1
和小数部分1
的浮点表示。由于是归一化值,我认为指数部分加1就足够了。
然而,((float) 0X800001) * 2.0
产生 0X1000002
。
这似乎是无符号整数的乘法,而不是浮点值。
总而言之,这些是我的问题,
float_twice(0X800001)
的正确输出是什么?如果正确的输出是
0X1000001
,为什么C计算((float) 0X800001) * 2.0
是0X1000002
?
您的测试不正确:((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;
}