计算机中浮点数的表示
IEEE浮点数表示:
在C语言中浮点数有两个size,32位和64位。其中32位浮点数:第1位是SignFlag(符号位),2-9位是阶码位(exponent),10-32位是尾数位(significand)。64位分别是第1位,2-12位,13-64位。
浮点数大小的公式是:x=(−1)s∗2E∗M
规格化值
E=exp−(2k−1−1),将exp看作无符号整数,k为exp的位数。
例如,对于32位浮点数来说k=8,E∈[−126,127],对于64位浮点数来说k=11,E∈[−1022,1023]。
M=1+0.frac,将frac看作小数值。
例如frac=10112,那M=12+0.10112=1.10112=11116。
这是通常情况下(规格化值)的计算公式,还有三种特殊情况。
非规格化值
当exp=0时,即是非规格化的值,这时:
E=1−(2k−1−1),k为exp的位数。
例如,对于32位非规格化值k=8,E=1−(27−1)=−126,对于64位来说k=11,E=1−(210−1)=−1022,我们发现非规格化的E和规格化的E的下界相等,这会导致非规格化值到规格化值的平滑转换。
M=0.frac
特殊值
当exp的位模式全为1时,也就是无符号整数的最大值,这时为特殊值,有两个特殊值:
- 当frac=0时,浮点数为无穷大
- 否则,浮点数为NaN(Not a Number),例如:√−1 。
舍入
IEEE标准中,由于精度问题,当一个浮点数无法准确表示一个实数时需要进行舍入。所用的方法是向偶数舍入。
用几个例子说明:
数字 | 舍入后 |
---|---|
1.4 | 1 |
1.6 | 2 |
1.5 | 2 |
2.5 | 2 |
3.5 | 4 |
如果该数字正好在上下界之间,则向偶数舍入,与我们通常的四舍五入略有区别。这样做的好处是:当有一组浮点数放在一起求平均值时可以保证误差最小,因为每个在上下界之间的数字都有百分之五十几率向下舍入,百分之五十几率向上舍入。
对于二进制小数也是如此
二进制小数 | 舍入后(保留小数点后一位) |
---|---|
10.01 | 10.0 |
10.011 | 10.1 |
10.11 | 11.0 |
11.001 | 11.0 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步