arccos求值

    xiaoxiao2021-03-28  95

    题目

    题目链接http://lx.lanqiao.cn/problem.page?gpid=T402

    问题描述   利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[-1, 1],返回值为[0, PI]。要求结果准确到小数点后5位。(PI = 3.1415926)   提示:要达到这种程度的精度需要使用double类型。 样例输入 0.5 样例输出 数据规模和约定   -1 <= x <= 1, 0 <= arccos(x) <= PI。

    思路

    1. 二分法逼近

    细节

    1. 测试数据中出现了-1,精确到10^-11才能逼近3.14159.。。。。。 2. %.5lf 发现一直输出0.00000, 原来是格式不对。。。printf只能用%f, 不能用%lf

    代码

    #include <bits/stdc++.h> using namespace std; const double pi = 3.1415926; int main() { double x; double hi, low, mi; while (cin >> x) { hi = pi; low = 0; while (hi - low > 0.000001) { mi = (hi + low)/2.0; if (cos(mi) - x > 0.00000000001) { low = mi; } else if (cos(mi) - x < -0.00000000001) { hi = mi; } else break; } // cout << "hi - low: " << hi - low << endl; // printf("%.5lf\n", mi); printf("%.5f\n", mi); } return 0; } 3.  思考了一下,+1和-1是cos函数 的极值点,函数在这两个点斜率为0,所以才要精确到10^-11.若将这两个点单独提出来,可以降低对判断精度的要求。 4.  再思考一下,发现应该从另一个方面考虑,应该要是arccos结果的精度,而不是二分判断时的精度。

    修改后的代码

    #include <bits/stdc++.h> using namespace std; const double pi = 3.1415926; const double zero = 0.00000000; const double EPS = 1E-14; //double 貌似可以精确到10^-15 int main() { double x; double hi, low, mi; while (cin >> x) { if(x == 1) {printf("%.5f\n", zero); continue; } if(x == -1) {printf("%.5f\n", pi); continue; } hi = pi; low = 0; while (hi - low > 0.000001) { mi = (hi + low)/2.0; if (cos(mi) - x > EPS) { low = mi; } else if (cos(mi) - x < -EPS) { hi = mi; } // else break; } printf("%.5f\n", mi); } return 0; } 最后,发现自己一开始就错了。。。 最终的代码 #include <bits/stdc++.h> using namespace std; const double PI = 3.1415926; int main() { double x; double hi, low, mi; while (cin >> x) { hi = PI; low = 0; while (hi - low > 0.000001) { mi = (hi + low)/2.0; if (cos(mi) - x > 0) { low = mi; } else if (cos(mi) - x < 0) { hi = mi; } } printf("%.5f\n", mi); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-664618.html

    最新回复(0)