是flt32
浮点数还是定点数的类型?
我怀疑它是定点算术的一种类型,而您没有正确使用它。让我解释一下。
顾名思义,定点数使用十进制数字的固定位置。这意味着它使用固定位数的小数部分。事实上,它是一个缩放的整数。
我猜flt32
您使用的类型对整个部分使用最高有效的 24 位,对小数部分使用最低有效的 8 位;32 位表示的实数值是与整数相同的 32 位表示的值除以 256(即 2 8)。
例如,32 位数字0x00000020
被解释为整数,如32
. 作为小数部分使用位的定点数8
,其值为0.125
( =32/256
)。
您发布的代码是正确的,但您没有正确使用它。
使用十进制数字编码为定点数的数字是( -32
)的整数表示。该算法正确地产生了( ); 这也是它被解释为定点的时候。8
0xFFFFE000
-8192
=-32*256
8192
0x00002000
=32*256
32
如果您传递-32
给函数而不注意将其编码为定点,它会正确地将其转换为32
并返回该值。但是32
( 0x00000020
) 是0.125
( =1/8=32/256
) 当它被解释为定点时(我假设函数printMask()
所做的)。
如何正确测试代码?
您可能有一个从整数创建定点数的函数。使用它来获得正确的表示-32
并将该值传递给flt32_abs()
函数。
如果你没有这样的功能,写起来很容易。只需将整数乘以256
(甚至更好,将其左移 8 位),仅此而已:
function int_to_fx32(int x)
{
return x << 8;
}
定点库通常使用宏进行此类转换,因为它们生成的代码更快。用宏表示,它看起来像这样:
#define int_to_fx32(x) ((x) << 8)
现在您进行测试:
fx32 negative = int_to_fx32(-32);
fx32 positive = fx32_abs(negative);
// This should print 32
printMask(positive, 32);
// This should print 8192
printf("%d", positive);
// This should print -8192
printf("%d", negative);
// This should print 0.125
printMask(32, 32);