快捷搜索: 王者荣耀 脱发

MATLAB浮点数运算精度问题

matlab计算题: 而后用matlab进行了一些浮点数计算,但结果都出乎预料: 2+2*eps = 2.000 3 + eps = 3 (3-3+3*eps)/eps = 3 eps是matlab中求浮点数的精度值的函数,eps表示eps(1)。如eps(1)实际表示的就是大于1而距离1最近的浮点数到1的距离,是1~2范围内浮点数的最小步长(1下一个浮点数是1+eps)。

浮点数表示方法: 在matlab中数值默认为双精度浮点数,其表示如下(从高位到低位):

63 62~51 52~0 符号位S(1负、0正) 阶码E(指数部分) 尾数F(小数部分)

规格化浮点数数值为: 其中E为阶码,Bias为偏阶双精度浮点数为1023,设置偏阶的原因是:使最小的负指数为全0,最大的正指数为全1,这样在比较大小时可以直接比较。 补充:指数为0、尾数非0表示非规格化数;指数2047、尾数为0,表示无穷;指数2047、尾数非0为NaN。 这样我们可以发现,浮点数并不是连续的,其精度与尾数位数和指数大小有关,具体为: 这就是最小步长。在2的两个幂之间,步长是相同的,比如eps(5)与eps(6)相等。

matlab的舍入规则:小于等于 0.5eps(i) 的舍弃,大于 0.5eps 的按1*eps处理。 这样就能解释为什么3+eps为整数3了:因为,eps为3处最小步长的一半,被舍弃了。 但这样还不能解释上述问题,因为3*eps=1.5eps(3),应当被舍入为1倍的eps(3),这样计算出来为2。

浮点数加法规则: ·对阶 将较小指数向较大指数靠近(精度损失小),在实际运算时溢出的位会保留,参与加法运算,最后再进行舍入(如3*eps最低位的1)。 注意,尾数有效位为52位

·有效位数相加 将连个浮点数的有效位数相加,溢出位保留。

·调整和舍入 调整为规格化数然后舍入 上述计算不需要进行调整,但需进行舍入,因为有一位的溢出位,舍入规则为:向偶数靠近 多余数字大于最低位一半则进位;小于最低位一半则舍弃;等于最低位一半时,若最低位为1则进位,最低位为0则舍弃。 该运算中,多余数字等于最低位一半,最低位为1,结果如下:。 这样再减去3,差为

经验分享 程序员 微信小程序 职场和发展