这是一个家庭作业问题。我已经在网上找到了很多代码,包括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
答案 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);
}