/*
* float_twice - Return bit-level equivalent of expression 2*f for
* floating point argument f.
* Both the argument and result are passed as unsigned int's, but
* they are to be interpreted as the bit-level representation of
* single-precision floating point values.
* When argument is NaN, return argument
* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
* Max ops: 30
* Rating: 4
*/
unsigned float_twice(unsigned f)
{
unsigned sign = f >> 31;
unsigned exp = (f >> 23) & 0xFF;
unsigned frac = f & 0x7FFFFF;
/* NaN, +oo, -oo */
if (exp == 0xFF)
return f;
if (exp == 0xFE) {
exp = 0xFF;
frac = 0;
} else if (exp > 0) {
exp++;
} else /* exp == 0 */ {
if ((frac & 0x400000) == 0x400000) {
exp = 1;
frac = (frac << 1) & 0x7FFFFF;
} else {
frac <<= 1;
}
}
return (sign << 31) | (exp << 23) | frac;
}在上面的代码中,查看最后一部分。
发布于 2018-07-21 23:26:51
代码正在编写的exp不是浮点值的数学指数.它是指数场的值,它的偏差为127。
对于法线数,指数场范围从1到254,对应于−126到127的数学指数。
在你询问的情况下,这个数字是不正常的。它的指数场为0(这也对应于−126的数学指数,与指数字段1相同,因为特殊处理低于正常值)。要使这个数字翻倍,代码将把这个意义移动一位。如果这从意义上带出1位,那么这个数字就变成正常的,而不是低于正常的。然后,它将有法向范围的最低指数,即指数字段中的1,对应于−126的数学指数。
https://stackoverflow.com/questions/51459601
复制相似问题