信息的表示和处理 及 CS:APP 15213 datalab (3)

12. 整数转浮点数,返回浮点数的二进制位表示, 可用符号不受限制
思路:核心在于发现该数的绝对值的最高位 1 对应浮点数隐式精度的 1, 然后最高位1后的23位排列在 frac 位置

取数的绝对值,后面对非负数数进行操作

取最少可以表达整数(最高位 1)的 k 位 inum,

所在的位数 n 整数i转浮点数f 在位模式上为 将 k-1 .. k-2 .. 0 放置在浮点数的 frac 部分,非规格数有一个隐式 1, 代替数字有效最高位 1

由上精度有限制,有效位的前23位充当尾数部分,要对后9位进行判断是否需要舍入

将 exp = 127 + n

符号位不变

其他 0 等情况考虑

/* * float_i2f - Return bit-level equivalent of expression (float) x * Result is returned as unsigned int, but * it is to be interpreted as the bit-level representation of a * single-precision floating point values. * Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while * Max ops: 30 * Rating: 4 */ unsigned float_i2f(int x) { unsigned abs_x = x; unsigned sign = x & 0x80000000; int flag = 0; int n = 30; if (x == 0) return x; else if (x == 0x80000000) return 0xcf000000; if (sign) abs_x = -x; while (!(abs_x & (1 << n))) n--; abs_x <<= 32 - n; if ((abs_x & 0x01ff) > 0x0100) flag = 1; else if ((abs_x & 0x03ff) == 0x0300) flag = 1; else flag = 0; return sign + ((n << 23) + 0x3F800000) + (abs_x >> 9) + flag; }

13. 浮点数转整数,返回整数的二进制位表示, 可用符号不受限制
思路:有上面的 float_i2f() 做铺垫,

集中在对精度的处理, 对于 exp

大于 31,超过整形的表达范围

小于 23,值不发生改变,右移 23 - exp

大于 23 小于等于 31,值发生改变 左移 exp -23

由于浮点数的正负只由符号位影响,所以可以最后做取负操作。

/* * float_f2i - Return bit-level equivalent of expression (int) f * for floating point argument f. * Argument is passed as unsigned int, but * it is to be interpreted as the bit-level representation of a * single-precision floating point value. * Anything out of range (including NaN and infinity) should return * 0x80000000u. * Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while * Max ops: 30 * Rating: 4 */ int float_f2i(unsigned uf) { unsigned sign = uf & 0x80000000; unsigned exp = uf & 0x7F800000; unsigned frac = uf & 0x007FFFFF; if (uf == 0x7F800000) return 0x80000000; else if (uf == 0) return 0; if (exp == 0) return 0; int m = 0x00800000 + frac; int e = (exp >> 23) - 127; if (e < 0) return 0; else if (e > 31) return 0x80000000; else if (e < 23) m >>= (23 - e); else m <<= (e - 23); if (sign) m = -m; return sign | m; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygzsg.html