浮点数简介
浮点数定义
IEEE 754标准下的浮点数定义:浮点数由符号位、指数位和尾数三部分组成。32位单精度浮点数符号位占1位,指数位占8位,尾数占23位,能够表示的范围:-3.4e38~3.4e38。64位双精度浮点数符号位占1位,指数位占11位,尾数占52位,能够表示的范围:-1.79e308 ~ +1.79e308。
非规格化浮点数
非规格化浮点数(Denormalized Number)是浮点运算中的一个特殊的值,在规格化浮点数中,尾数的前导固定为1,如浮点数0.001234,其规格化浮点数表示为1.234e-3,但对于某些极小值的浮点数,例如1.234e-40,该数的指数部分超出单精度浮点数的指数范围,则需要在尾数补0,表述为0.01234e-38,类似这种尾数前导为0的浮点数即为非规格浮点数。单精度能够表示最小的非0正数是1.17549435082e-38(0x800000),其非规格浮点数范围是-1.17549435082e-38~1.17549435082e-38。
ULP
ULP(Unit in the Last Place)定义为:在计算机科学和数值分析中,最后一位上的单位值或称最小精度单位,缩写为ULP,是毗邻的浮点数值之间的距离,也即浮点数在保持指数部分的时候最低有效数字为1所对应的值。
以实数值0.1来说明ulp,实数值为0.1的单精度浮点数为0x3dcccccc(0.099999994039536),或者为0x3dcccccd(0.10000000149012)。则实数值0.1的ulp为|0.10000000149012 - 0.099999994039536| = 0.000000007450584
如果计算机使用向下近似的方法则用0.099999994039536来表示0.1,误差为0.1-0.099999994039536=0.000000005960464 ≈ 0.8ulp
如果计算机使用向上近似的方法则用0.10000000149012来表示0.1,误差为0.10000000149012-0.1=0.00000000149012 ≈ 0.2ulp。
舍入
IEEE 754标准定义了4种舍入方式:
- Round toward nearest:舍入到最接近的数,在一样接近的情况下偶数优先(在二进制中是以0结尾的)。
- Round toward+∞:会将结果朝正无限大的方向舍入。
- Round toward -∞:会将结果朝负无限大的方向舍入。
- Round toward zero:会将结果朝0的方向舍入。