Floating point 操作IEEE-754浮点编码 /* *float_tweep-返回表达式2*f的等效位级别 *浮点参数f。 *参数和结果都作为无符号int传递,但是 *它们将被解释为数据的位级表示 *单精度浮点值。 *当参数为NaN时,返回参数 *合法运算:任何整数/无符号运算,包括| |、&&。也如果 *最多运行时间:30 *评级:4 */ 无符号浮点_两次(无符号f) { 无符号符号=f>>31; 无符号exp=(f>>23)&0xFF; 无符号分形=f&0x7FFFFF; /*楠,+oo,-oo*/ 如果(exp==0xFF) 返回f; 如果(exp==0xFE){ exp=0xFF; 分形=0; }否则如果(exp>0){ exp++; }else/*exp==0*/{ 如果((分形&0x400000)=0x400000){ exp=1; frac=(frac
代码正在准备的Floating point 操作IEEE-754浮点编码 /* *float_tweep-返回表达式2*f的等效位级别 *浮点参数f。 *参数和结果都作为无符号int传递,但是 *它们将被解释为数据的位级表示 *单精度浮点值。 *当参数为NaN时,返回参数 *合法运算:任何整数/无符号运算,包括| |、&&。也如果 *最多运行时间:30 *评级:4 */ 无符号浮点_两次(无符号f) { 无符号符号=f>>31; 无符号exp=(f>>23)&0xFF; 无符号分形=f&0x7FFFFF; /*楠,+oo,-oo*/ 如果(exp==0xFF) 返回f; 如果(exp==0xFE){ exp=0xFF; 分形=0; }否则如果(exp>0){ exp++; }else/*exp==0*/{ 如果((分形&0x400000)=0x400000){ exp=1; frac=(frac,floating-point,precision,floating-accuracy,ieee-754,Floating Point,Precision,Floating Accuracy,Ieee 754,代码正在准备的exp不是浮点值的数学指数。它是指数字段的值,偏移127 对于正常数,指数字段的范围为1到254,对应于−126对127 在您询问的情况下,数字低于正常值。其指数字段为0(也对应于−126,与指数字段1相同,因为次正常值是专门处理的)。若要将数字加倍,代码将有效位左移一位。如果有效位中有1位,则数字将变为正常值,而不是次正常值。然后,它将具有正常范围的最低指数,即指数字段中的1,对应于的数学指数为−126.查看最小规范化的binary32数字的真实指数。它是-126。因此,存储在b
exp
不是浮点值的数学指数。它是指数字段的值,偏移127
对于正常数,指数字段的范围为1到254,对应于−126对127
在您询问的情况下,数字低于正常值。其指数字段为0(也对应于−126,与指数字段1相同,因为次正常值是专门处理的)。若要将数字加倍,代码将有效位左移一位。如果有效位中有1位,则数字将变为正常值,而不是次正常值。然后,它将具有正常范围的最低指数,即指数字段中的1,对应于的数学指数为−126.查看最小规范化的
binary32
数字的真实指数。它是-126。因此,存储在binary32
指数字段中的偏差指数是-126+127=1.127,这是正常浮点值的偏差。
/*
* 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;
}