eps二分

模板。

带eps的二分,常用于double类型查找,注意设置精度。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 
 5 using namespace std;
 6 
 7 #define eps 0.000001
 8 
 9 int t;
10 double y;
11 
12 double f(double x){
13     return 8.0*x*x*x*x+7.0*x*x*x+2.0*x*x+3.0*x+6.0;
14 }
15 
16 //递归版eps二分
17 double b_srch(double begin, double end){
18     double mid = (begin + end) / 2;
19     double ret;
20     double result = f(mid);
21     if(fabs(result - y) < eps){
22         return mid;
23     }
24     else if(result > y){
25         ret = b_srch(begin, mid);
26     }
27     else if(result < y){
28         ret = b_srch(mid, end);
29     }
30     return ret;
31 }
32 
33 //循环版eps二分
34 double b_srch2(double begin, double end){
35     double mid = (begin + end) / 2;
36     while(fabs(f(mid) - y) > eps){
37         if(f(mid) > y){
38             end = mid;
39         }
40         else{
41             begin = mid;
42         }
43         mid = (begin + end) / 2;
44     }
45     return mid;
46 }
47 
48 int main()
49 {
50     scanf("%d", &t);
51     while(t--){
52         scanf("%lf", &y);
53         if(y < 6 || y > 807020306){
54             printf("No solution!\n");
55         }
56         else{
57             double result = b_srch(0, 100);
58             printf("%.4f\n", result);
59         }
60     }
61     return 0;
62 }
63 //HDU2199

 

posted @ 2016-02-22 13:36  喷水小火龙  阅读(107)  评论(0)    收藏  举报