我必须找到x的值使得f(x)=C,其中f是在[a,b]区间内单调递增的函数。它必须具有对数复杂度所以我写了这个函数我认为它是正确的:
double search(double a, double b, double c, double (*f)(double x)) {
double pivot;
do {
pivot = abs((a-b)/2);
if (abs((*f)(pivot) - c) < 0.001) { //f(x) == c
return pivot;
} else if ((*f)(pivot) > c) {
b = pivot;
} else {
a = pivot;
}
} while (abs(a-b) != 0);
return 0;
}
无论何时我这样调用它,它都能工作:
int main(void) {
double a = 0.0, b = 10.0, c = 5.0;
cout << search(a, b, c, func1) << endl;
return 0;
}
但是如果我把它改成这个(b
的值):
int main(void) {
double a = 0.0, b = 100.0, c = 5.0;
cout << search(a, b, c, func1) << endl;
return 0;
}
当函数被调用时,我得到一个分段错误。这里出了什么问题?(我可以看到,当我使用VSCode调试器调用函数时,程序崩溃。否则,当我只是编译和运行它时,它似乎陷入无限循环或其他东西,即它不会抛出分段错误)。
如果需要,func1
只做return 2 * x
。
编辑:
这里是完整的.cpp
文件,如果有人需要它复制:
#include <iostream>
using namespace std;
double func1(double x) {
return 2 * x;
}
double func2(double x) {
return x + 0.5;
}
double search(double a, double b, double c, double (*f)(double x)) {
double pivot;
do {
pivot = abs((b-a)/2);
if (abs((*f)(pivot) - c) < 0.1) { //f(x) == c
return pivot;
} else if ((*f)(pivot) > c) {
b = pivot;
} else {
a = pivot;
}
} while (abs(b-a) != 0);
return 0;
}
int main(void) {
double a = 0.0, b = 10.0, c = 5.0;
cout << search(a, b, c, &func1) << endl;
cout << search(a, b, c, func1) << endl;
return 0;
}
将b的值更改为100.0会导致故障发生。
pivot = abs((a-b)/2);
是错误的,因为它计算的是从a到b的距离的一半,而不是它们的中间点,使用:
pivot = abs((a-b)/2)+a; // provided that *a* is less than *b*