浮点数的按位乘法

时间:2016-07-16 03:20:52

标签: c floating-point bit-manipulation

我正在研究一个学校项目,它要求我只使用二进制表示来操纵浮点数,特别是将浮点数乘以2。我应该只使用位操作(!| ^&〜),逻辑运算符(&&,||)和if / while表达式来复制以下代码的功能。

但是,我遇到一些问题,我的一些数字没有正确的结果。例如,当我传入8388608(0x800000)时,当 为16777216(0x1000000)时,输出为8388608。

以下是我们应该复制其功能的代码:

unsigned test_dl23(unsigned uf) {
float f = u2f(uf);
float tf = 2*f;
if (isnan(f))
  return uf;
else
  return f2u(tf);
}

这是我的尝试:

unsigned dl23(unsigned uf) {

int pullExpMask, expMask, mantMask, i, mask, signedBit
mask = 0x007fffff;

pullExpMask = (-1 << 23) ^ 0x80000000; // fills lower 23 bits with zeroes
signedBit = 0x80000000 & uf;
expMask = (uf & pullExpMask); // grabs the exponent and signed bits, mantissa bits are zeroes
mantMask = mask & uf;

if (!(uf & mask)){ // if uf has an exponent that is all ones, return uf
    return uf;
}

else if (expMask == 0){
   mantMask =  mantMask << 1;

} 
else if (expMask != 0){
  expMask = expMask + 0x00100000;
}

return (signedBit | expMask | mantMask);


}

我一直在研究这个问题很长一段时间,非常感谢任何有用的提示!

1 个答案:

答案 0 :(得分:0)

我不确定您指的是哪些数字失败,但我确实在您的代码中看到了导致此行为的错误。注释// if uf has an exponent that is all ones, return uf的部分不会执行此描述。它将测试尾数部分为0并返回未更改的数字,从而导致您看到的行为。它应该类似于if (expMask == pullExpMask) {

此外,您需要考虑指数增量使其全部为1的情况。它应该始终成为inf,而不是安静或信号NaN。