flt32 flt32_abs (flt32 x) {
int mask=x>>31;
printMask(mask,32);
puts("Original");
printMask(x,32);
x=x^mask;
puts("after XOR");
printMask(x,32);
x=x-mask;
puts("after x-mask");
printMask(x,32);
return x;
}
这是我的代码,对值 -32 调用函数将返回 0.125。我很困惑,因为这是一个非常直接的腹肌公式,但我似乎遗漏了一些东西。有任何想法吗?
最佳答案
flt32
是浮点类型还是 fixed point数字?
我怀疑这是一种定点算术类型,而您没有正确使用它。让我解释一下。
顾名思义,定点数使用固定的小数位;这意味着它使用固定位数的小数部分。事实上,它是一个按比例缩放的整数。
我猜您使用的 flt32
类型对整个部分使用最高有效 24 位,对小数部分使用最低有效 8 位; 32 位表示的实数值是相同的 32 位整数表示的值除以 256(即 28)。
例如,32 位数字 0x00000020
被解释为整数 32
。作为小数部分使用 8
位的定点数,其值为 0.125
(=32/256
)。
您发布的代码是正确的,但您没有正确使用它。
使用8
十进制数字编码为定点数的数字-32
是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);
关于c - 使用位算术从二进制 int 获取绝对值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35235400/