MATLAB绝对值与条件语句Bug:输入5.3时判定异常
MATLAB浮点数精度导致的判断异常问题解决
你遇到的问题本质是浮点数的二进制存储精度限制。十进制的5.3和5.4无法被二进制浮点数精确表示,当输入5.3时,part-5.4的实际计算结果并不是精确的-0.1,它的绝对值会略大于0.1,导致abs(part-5.4) <=0.1的判断不成立。
比如在MATLAB里直接运行:
abs(5.3 - 5.4) <= 0.1
返回结果是false,实际计算5.3-5.4的结果是-0.10000000000000009,绝对值比0.1大一点点。
解决这个问题有几种常用方法:
方法一:引入微小容差
给判断条件加一个极小的误差范围,用MATLAB内置的eps函数(表示浮点数的最小精度差):part = input("Enter the length of a part"); if (part<0) error("Illegal input"); elseif (abs(part-5.4) <= 0.1 + eps(0.1)) disp("Part is good"); else disp("Part is not good"); end方法二:转换为整数运算
把小数乘以10转成整数,彻底避免浮点数精度问题:part = input("Enter the length of a part"); if (part<0) error("Illegal input"); elseif (abs(round(part*10) - 54) <= 1) disp("Part is good"); else disp("Part is not good"); end这里用
round是为了处理输入时的微小精度偏差,比如用户输入5.3000000001也能正确判定。方法三:直接范围判断(带容差)
直接比较数值是否在[5.3,5.5]区间,同时给边界加容差:part = input("Enter the length of a part"); if (part<0) error("Illegal input"); elseif (part >= 5.3 - eps(5.3) && part <=5.5 + eps(5.5)) disp("Part is good"); else disp("Part is not good"); end
这些方法都能规避浮点数精度带来的判断误差,其中整数运算的方式更直观,也不容易出错。
内容的提问来源于stack exchange,提问作者cubaintyoshi
相关产品推荐
相关产品推荐

