while(r-l>=0.001){ m=(r+l)/2; if(fn(l)*fn(m)>0)l=m; else r=m; } printf("%.2lf ",l); //方程求根,给定单调区间[l,r] /* 1.l为根,m和r在l的右侧,fn(l)=0,fn(l)*fn(m)=0,else条件成立r=m,r向根l逼近 再次循环,l值未改变依旧为根,m和r依旧在l的右侧,fn(l)=0,fn(l)*fn(m)=0,else条件r=m,r向根l逼近 因此l为根可得出正确的近似解 2.r为根,l和m在r的左侧,fn(r)=0,fn(l)*fn(m)>0,if条件成立l=m,l向根r逼近 再次循环,r值未改变依旧为根,l和m依旧在r的左侧,fn(r)=0,fn(l)*fn(m)>0,if条件成立l=m,l向根r逼近 因此r为根可得出正确的近似解 3.假设二分到方程根,即某次循环中fn(m)=0,else条件成立r=m,r为方程的根, 再次计算m的值,l和m一定在根r的左侧, fn(r)=0,fn(l)*fn(m)>0,if条件成立l=m,l向根r逼近 注:如果if语句条件改为 fn(l)*fn(m)>=0 , 假设二分到方程根,即某次循环中fn(m)=0,if条件成立l=m,l为方程的根, 再次计算m的值,m和r在根l的右侧,fn(l)=0,if条件成立l=m,此时[l,r]之间不存在根, 所以这种写法是错误的 4.l和r会精确到x.xxx?的形式,所以第3位小数一定是准确的,进而由它四舍五入到第二位小数 */
原文:https://www.cnblogs.com/lyt888/p/12616836.html