浮点数
浮点数表示对形如$V=x*2^y$的有理数进行编码
二进制小数
十进制小数表示法使用如下形式的表示: $$d_md_{m-1}…d_1d_0.d_{-1}d_{-2}…d_{-n}$$
其中每个十进制数$d_i$的取值范围是$0\sim9$。这个表达式描述的数值$d$定义如下: $$d=\sum_{i=-n}^{m}10^i*d_i$$
数字权的定义与十进制小数点符号“.”相关,这意味着小数点左边的数字的权是10的正幂,得到整数值,而小数点右边的数字的权是10的负幂,得到小数值。
二进制小数的表示形如 $$b_mb_{m-1}…b_1b_0.b_{-1}b_{-2}…b_{n-1}b_{-n}$$
其中每个二进制数字,$b_i$的取值范围为0和1。
这种表示方法表示的数$b$定义如下: $$b=\sum_{i=-n}^{m}2^i*b_i$$
符号“.”现在是二进制的小数点,点左侧的位的权是2的正幂,点右侧的位的权是2的负幂。
二进制表示法只能准确表示那些能够被写成$x*2^y$的数,其他的值只能够近似地表示。
以上统称为定点表示法,不能很有效地表示非常大地数字。例如,表达式$5*2^{100}$是101后面跟随100个零的位模式来表示。
IEEE浮点表示
通过给定$x$和$y$的值,来表示形如$x*2^y$的数。
IEEE浮点标准用$V=(-1)^sM2^E$的形式来表示一个数:
- 符号$s$决定这数是负数($s=1$)还是整数($s=0$),而对于数值0的符号位解释作为特殊情况处理。
- 尾数$M$是一个二进制小数吗,它的范围是$1\sim2-\epsilon$或者是$0\sim1-\epsilon$。
- 阶码$E$的作用是对浮点数加权,这个权重是2的$E$次幂。
- 一个单独的符号位$s$直接编码符号$s$。
- $k$位的阶码字段$exp=e_{k-1}…e_1e_0$编码阶码$E$。
- $n$位小数字段$frac=f_{n-1}…f_1f_0$编码尾数$M$,但是编码出来的值也依赖于阶码字段的值是否等于$0$。
在单精度浮点格式(float)中,$s$、$exp$、$frac$字段分别为$1$、$k=8$位、$n=23$位,得到一个32位的表示。
在双精度浮点格式(double)中,$s$、$exp$、$frac$字段分别为$1$、$k=11$位、$n=52$位,得到一个64位的表示。
给定位表示,根据$exp$的值,被编码的值可以分为三种不同的情况。
规格化的值
- 当$exp$的位模式既不全为0,也不全为1(单精度为255,双精度为2047),都属于这种情况。在这种情况下,阶码字段被解释为以偏置形式表示的有符号整数。也就是说,阶码的值是$E=e-Bias$,其中$e$是无符号数,其位表示为$e_{k-1}…e_1e_0$,而$Bias$是一个等于$2^{k-1}-1$(单精度为127,双精度为1023)的偏置。由此产生指数的取值范围,对于单精度是$-126\sim+127$,对于双精度是$-1022\sim+1023$。
- 小数字段$frac$被解释为描述小数值$f$,其中$0\leq f<1$,其二进制表示为$0.f_{n-1}…f_1f_0$,也就是二进制小数点在最高有效位的左边。尾数定义为$M=1+f$,这种方式也叫做隐含的以1开头的表示,因此我们可以把$M$看成一个二进制表达式为$1.f_{n-1}f_{n-2}…f_0$的数字。
非规格化的值
- 当阶码域为全0时,所表示的数是非规格化形式。在这种情况下,阶码值是$E=1-Bias$,而尾数的值是$M=f$,也就是小数字段的值,不包含隐含的开头的1。
- 使阶码值为$1-Bias$而不是$-Bias$,这会使非规格化值平滑转换到规格化值。
- 非规格化值有两个用途。1、提供了一种表示数值0的方法,因为使用规格化数,我们必须总是使$M\geq 1$,因此不能表示0。实际上,$+0.0$的浮点表示的位模式为全0。2、表示那些非常接近于$0.0$的数。
特殊值
- 当阶码全为1时,即为特殊值。当小数域为全0时,得到的值表示无穷,当$s=0$时是$+\infty$,当$s=1$时是$-\infty$。当小数域为非零时,结果值被称为“NaN”。
舍入
浮点数计算
- 对阶
- 小阶向大阶对齐,尾数右移。
- 尾数运算
- 结果规格化
- 舍入处理
- 原文作者:生如夏花
- 原文链接:https://blduan.top/post/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/networkengineer/float/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。