有关计算机中浮点运算的部分,涉及IEEE 754标准 博客的公式差点挂了……
在计算机中,使用科学计数法表示二进制数
1.0_{2(底数F)} \times2^{-1(指数E)}
规格化二进制数
即小数点左边只有一位的使用科学计数法表示的实数,如
1.23 \times 10^{-2}
这样就不是规格化的二进制数:12.3 \times 10^{-3}
在计算机中,浮点数以规格化二进制数表示3.5.1 浮点表示
一般浮点数的表示
(-1)^s \times F \times 2^E$$
表示范围: $$2.0{10}\times 10^{-38} \sim2.0{10}\times 10^{38} $$
双精度(double precision)浮点数由两个32位字表示
双精度字占用两个32位字,由 符号位s 11位指数域, 52位尾数域构成
可表示
$$2.0{10}\times 10^{-308} \sim2.0{10}\times 10^{308} $$
IEEE 754浮点标准是通用标准,通用语1980年后的每台计算机
因为在规格化数中,前导位肯定是非0位,而在二进制数中,非零位只有1,也就是说前导位必为1,所以完全可以隐藏掉
这样,可以为表示范围腾出更多空间
所以,单精度下,数有24(1+23)位宽
双精度下,数有53(1+53)位宽 $$(-1)^s \times (1+F)\times 2^E$$ 向十进制转换: $$(-1)^s \times [1+(s_1\times 2^{-1})+(s_2\times 2^{2})+(s_3\times 2^{-3})+(s_4\times 2^{-4})+\cdots]\times 2^E$$
IEEE 754浮点数标准还定义了一些其他的数学表述,比如$\pm \infin$,$\rm NaN$
$\rm NaN$ (Not A Number)可用于表示无效操作,可表示数学上的“不存在”(我不确定),用于让 程序员推迟程序中的一些测试和决定
使用符号位和数值的形式表示(而不是补码),便于快速进行整数比较
目的
若采用补码形式,负指数看起来似乎是一个大得多的数
简而言之,偏阶就是给指数加上另一个数(偏阶),使他成为易于比较的(无符号)正整数
单精度的指数偏阶是127,
双精度的指数偏阶是1023,
综上所述,单精度的IEEE 754完整表示是 $$(-1)^s \times (1 + \rm Fraction)\times 2^{(Exponent - Bias)}$$
例:使用浮点表示 $-0.75{10}$ $$-0.75{10} = -\frac{3}{4{10}} = -\frac{3}{2^2{10}}\\,\二进制小数形式:\qquad -\frac{11_2}{2_2^{10}} 或 -0.11_2\\,\科学计数法:\qquad-0.11\times2^0\\,\规格化计数:\qquad -1.12\times2^{-1}\\,\$$ 所以,$-0.75{10}$得单精度二进制格式为:
在浮点数计算中,浮点加法比浮点乘法复杂,因为存储的是规格化数,需要对齐小数点,而乘法不用对齐。
浮点加法,简单来说分为以下4步
以下是在原书给出得算术单元结构上做的笔记:
浮点乘法相对直观
可以参见资料,不再赘述
IEEE 754标准中规定了确保算术精确性的方法: 在计算过程中在右侧增加保护位和舍入位
这是书中的一个例子,不方便打出来,就直接贴图了:
结果可以看到,采用保护位得到的结果是2.37,不采用保护位得到的结果是2.36,实际结果更接近前者。这说明了保护位的作用。可以联系一下我们做数学题的时候按要求四舍五入,总要往后算两位。
衡量浮点的精确性通常用尾数最低位(ulp)上有多少位的误差来衡量
IEEE 754 保证了计算机使用的数在半个ulp以内.
对于 0.5的情况,IEEE 754的做法是:如果最后一位是奇数,就+1;如果是偶数,就截去。
舍入位左边的数非零时置1,可让计算机区分 $0.50\cdots000{10}$和$0.50\cdots001{10}$
IEEE 754标准浮点表示 $$ (-1)^s \times (1 + \rm Fraction)\times 2^{(Exponent - Bias)} $$