将单精度浮点数乘以2

时间:2014-09-19 16:12:49

标签: c floating-point bit-manipulation

这是一个家庭作业问题。我已经在网上找到了很多代码,包括StackOverflow中的一些代码。但我只想要概念而不是代码。我想自己实现它。所以我想要实现的功能是:

  • float_twice - 返回浮点参数2*f的表达式f的位级相等。
  • 参数和结果都作为unsigned int传递,但它们将被解释为单精度浮点值的位级表示。

我想知道如何做到这一点。我知道浮点表示法。并阅读有关如何乘以两个浮点数的维基页面,但不理解它。我只是想知道它的概念/算法。

编辑:

谢谢大家。根据您的建议,我写了以下代码:

unsigned float_twice(unsigned uf) {
    int s = (uf >> 31) << 31;
    int e = ((uf >> 23) & 0xFF) << 23;
    int f = uf & 0x7FFF;

    // if exponent is all 1's then its a special value NaN/infinity
    if (e == 0xFF000000){
        return uf;

    } else if (e > 0){  //if exponent is bigger than zero(not all zeros', not al 1's, 
                        // then its in normal form, add a number to the exponent
        return uf + (1 << 23);

    } else { // if not exponent not all 1's and not bigger than zero, then its all 
             // 0's, meaning denormalized form, and we have to add one to fraction

        return uf +1;
    } //end of if

} //end of function

1 个答案:

答案 0 :(得分:3)

你可以做这样的事情(虽然有些人声称它违反了严格别名规则):

unsigned int func(unsigned int n)
{
    float x = *(float*)&n;
    x *= 2;
    return *(unsigned int*)&x;
}

void test(float x)
{
    unsigned int n = *(unsigned int*)&x;
    printf("%08X\n",func(n));
}

在任何情况下,您都必须声明float的大小等于平台上int的大小。


如果你只想取一个unsigned int操作数并在其上执行将float乘以2的等效操作,那么你可以简单地将1加到它的指数部分(位于位) 20-30):

unsigned int func(unsigned int n)
{
    return n+(1<<20);
}