我正在编写一个程序来编程二分法:https://www.calculushowto.com/bisection-method/
我知道有类似的问题,但我想看看我自己的工作。
double func(double x) {
return x * x - 3 * x - 1;
}
double bisect(double (*f)(double), double a, double b, double e) {
double mid = (a + b) / 2;
while (abs(mid) > e) {
if (f(mid) < 0) {
mid = a;
} else {
mid = b;
}
}
return mid;
}func()是我用来测试二分法的函数。在另一个函数中,a是左点,b是右点,e是错误界。
有什么我没发现的错误吗?
发布于 2021-02-03 06:41:14
a和b之间有一个根。如果不是这样,bisect永远不会终止。假设f行为良好,谨慎的做法是在继续之前测试f(a)和f(b)是否有不同的迹象。另外,考虑一下f(a) > 0 && f(b) < 0的情况bisect找不到根的近似。它发现了一个f相当小的论点。它可能离根很远。谨慎的终止条件是b - a < e。a + b可能溢出,然后所有的赌注都关闭。考虑一下mid = a + (b - a)/2。https://codereview.stackexchange.com/questions/255532
复制相似问题