2014-09-19 47 views
3

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

  • float_twice - 返回位水平相当于浮点参数f表达2*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 
+2

float的一个组件表示二的幂。这是你应该感兴趣的部分。 – user2357112 2014-09-19 16:14:23

+1

如果你知道表示的工作原理,试试'f'的例子,并将其编码与'2 * f'的编码进行比较。任意浮点数的乘法比乘以2要复杂得多,所以如果你现在有麻烦的理解前者可能无关紧要。 – mafso 2014-09-19 16:17:02

+1

一个好的开始可能是'printf()'输出'f'和'2 * f'的位模式。 – 5gon12eder 2014-09-19 16:17:13

回答

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); 
} 
+3

OP想要我想要的位级操作。他只需要移位表示exp的位。 – HuStmpHrrr 2014-09-19 16:24:40

+1

@mafso:哦,好吧,我会删除它。 – 2014-09-19 16:25:39

+0

只要离开它。它向OP展示了如何打印几位数字的位模式,从而得出一个想法,并且我已经向他建议了从哪里开始。 – 5gon12eder 2014-09-19 16:27:15