浮点数二分
以前的模板:while(r - l > eps)...
可能会导致循环次数不够导致精度问题,现在改进的万无一失写法把循环次数人为增大(并不会怎么影响算法时间复杂度)for(int i = 0; i < 100; i ++ )
,以保证精度!循环次数可以适当增大或减小在[50, 100]
之间即可。
由此还可能引申出浮点数关于四舍五入的问题 :这时可以使用<cmath>
中的floor(下取整), ceil(上取整), round来解决。
万无一失写法
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
double x, l = -10000, r = 10000;
scanf("%lf", &x);
for(int i = 0; i < 100; i ++ ){
double mid = (l + r) / 2;
if(mid * mid * mid <= x) l = mid;
else r = mid;
}
printf("%.6lf", l);
return 0;
}
万可能有一失写法:
#include <iostream>
using namespace std;
int main(){
double n , l = -10000 , r = 10000;
cin >> n;
while(r - l > 1e-7){
double mid = (l + r) / 2;
if(mid * mid * mid >= n) r = mid;
else l = mid;
}
printf("%.6lf", r);
return 0;
}
tql