奇数函数指针分段故障



我必须找到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);是错误的,因为它计算的是从ab的距离的一半,而不是它们的中间点,使用:

pivot = abs((a-b)/2)+a; // provided that *a* is less than *b*

最新更新