c++ - 奇函数指针分段错误
问题描述
我必须找到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*
推荐阅读
- python - 如何修复 AttributeError:“JpegImageFile”对象没有属性“load_img”
- rust - 在 trait 默认方法中多次自我借用
- arrays - Google Apps 脚本:创建和填充嵌套 JSON 对象
- amazon-web-services - 交叉编译 aws webrtc 库时出现库链接错误
- javascript - 减少 javascript for 语句中的代码,其中包含一组 div 和输入
- javascript - 在JavaScript中记录mysql结果时“TextRow”来自哪里
- swift - ScrollView 或 List,如何制作特定的可滚动视图 (SwiftUI)
- reactjs - 如何为 2 个不同的子域支持 React js 应用程序
- javascript - 如何在 Aframe 中使用 Three.InstancedMesh
- html - Unable to Set SVG As BackGround