这是一个家庭作业问题。我已经在网上找到了很多代码,包括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
float的一个组件表示二的幂。这是你应该感兴趣的部分。 – user2357112 2014-09-19 16:14:23
如果你知道表示的工作原理,试试'f'的例子,并将其编码与'2 * f'的编码进行比较。任意浮点数的乘法比乘以2要复杂得多,所以如果你现在有麻烦的理解前者可能无关紧要。 – mafso 2014-09-19 16:17:02
一个好的开始可能是'printf()'输出'f'和'2 * f'的位模式。 – 5gon12eder 2014-09-19 16:17:13