本文内容基于《码出高效 Java开发手册》,杨冠宝、高海慧著。
1. 背景
使用浮点数存储和计算的场景无处不在,若使用不当则容易造成计算值与理论值不一致:
浮点数是以科学计数法来表示的,原因是科学计数法可以唯一地表示任何一个数,且所占用的存储空间会更少,计算机就是利用这一特性表示极大或极小的数值。
2. 浮点数表示
浮点数表示就是如何用二进制数表示符号、指数和有效数字。以IEEE754标准中的单精度浮点数为例:
- 符号位
在最高二进制位上分配1位表示浮点数的符号,0表示正数,1表示负数。
- 阶码位
在符号位右侧分配8位用来存储指数,阶码位存储的是指数对应的移码。移码是将一个真值在数轴上正向平移一个偏移量之后得到的,假设指数的真值是e,阶码为E,则有E = e + (2 ^ (n - 1) - 1),其中n是阶码的二进制位数。
- 尾数位
最右侧分配连续的23位用来存储有效数字,以原码表示。二进制数值规格化后的尾数形式为1.xyz,满足1≤|a|<2,为了节约存储空间,将符合规格化