【发布时间】:2014-09-19 16:12:48
【问题描述】:
这是一道作业题。我已经在网上找到了很多代码,包括 StackOverflow 中的一些代码。但我只想要概念而不是代码。我想自己实现它。所以我要实现的功能是:
-
float_twice- 为浮点参数f返回表达式2*f的位级等效项。 - 参数和结果都作为
unsigned int传递,但它们将被解释为单精度浮点值的位级表示。
我想知道如何做到这一点。我知道浮点表示。并阅读关于如何将两个浮点数相乘的wiki页面,但不明白。我只是想知道它的概念/算法。
编辑:
谢谢大家。根据您的建议,我编写了以下代码:
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
【问题讨论】:
-
浮点数的一个分量代表二的幂。这是您应该感兴趣的部分。
-
如果您知道表示的工作原理,请尝试一些示例
f并将其编码与2*f的编码进行比较。任意浮点数的乘法比仅仅乘以 2 复杂得多,所以如果您现在无法理解前者可能并不重要。 -
一个好的开始可能是
printf()出f和2 * f的位模式。 -
数字的指数部分是2的幂;乘以 2 意味着将该值加一,担心溢出变成无穷大,NaN 保持 NaN,零保持零。
-
请注意,您需要特殊情况的非规范化。
标签: c floating-point bit-manipulation