我正在编写一个使用强力解决方程的程序。不幸的是,我的代码似乎在某处出错,因为我的程序在search = 0.19999
处停止。这是代码:
#include <iostream>
#include <cmath>
#include <vector>
#define min -4.0
#define max 6.5
using namespace std;
double fx (double x){
long double result = cos(2*x)-0.4*x;
double scale = 0.00001;
double value = (int)(result / scale) * scale;
return value;
}
int sign (double a){
if(a<0) return -1;
if(a==0) return 0;
else return 1;
}
int main(){
vector <double> results;
double step, interval, start, end, search;
interval=(fabs(min)+fabs(max))/50;
step=0.00001;
start=min;
end=min+interval;
search=start;
while(end <= max){
if(sign(start) != sign(end)){
search=start;
while(search < end){
if(fx(search) == 0) results.push_back(search);
search=search+step;
}
}
start=end;
end=start + interval;
}
for(int i=0; i<results.size(); i++){
cout << results[i] << endl;
}
}
我已经看了很长时间了,我仍然无法在代码中找到错误。 程序应检查每个给定间隔中是否存在根,如果是,则检查该间隔中的每种可能性。如果找到根,则应将其推入结果向量。
答案 0 :(得分:1)
我知道你已经找到了答案,但我在尝试查找错误时发现了一个问题。在第37行,您进行以下比较:
if(fx(search) == 0)
由于您的fx
函数返回double
。在处理双精度浮点数时,通常不建议使用等运算符进行测试。你的结果可能永远不会完全 0,那么这个测试将永远不会返回true。我认为您应该使用最大误差范围进行比较,如下所示:
double maximum_error = 0.005;
if(abs(fx(search)) < maximum_error)
我认为这样可以解决你的问题。您可以在this link
上找到更多信息即使它现在正在工作,输入数字,CPU架构甚至编译器标志的微小变化都可能会破坏您的程序。比较C ++中的双打是非常危险的,尽管这样做是合法的。
答案 1 :(得分:0)
我刚刚再次运行代码并发现了错误。
if(sign(start) != sign(end))
是罪魁祸首。如果start
和end
的f(x)值具有不同的符号,则会有根。相反,我写道,如果start
和end
的符号不同,则会有根。对不起,大惊小怪。