1.要求4位小数,精度可以开得更高些
2.可以取得到的一般r - l >= eps,有等号
3.r = mid - eps,l = mid + eps往2边都取eps
4.最后退出的时候仍然取mid,(l + r) / 2;
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double eps = 1e-6;
double y;
double equation(double x)
{
return (((8 * x + 7) * x + 2) * x + 3) * x + 6;
}
void solve(double y)
{
if (y < 6.0 || y > equation(100.0)) {
printf("No solution!\n");
return;
}
double l = 0.0,r = 100.0;
double mid = 0;
while (r - l >= eps) {
mid = (l + r) / 2;
if(equation(mid) > y)
r = mid - eps;
else l = mid + eps;
}
printf("%.4lf\n",(l + r) / 2);
}
int main()
{
int T;
cin >> T;
while (T --) {
scanf("%lf",&y);
solve(y);
}
return 0;
}