C++ == 运算符不工作
C++ == operator not working
>我正在C++中应用 Regula Falsi 方法,但问题在于 == 运算符,当 F(x3) 变为 0 时,如果 (fabs( f(x3))==0 应该停止并从循环中出来,但它不会停止为什么为什么为什么......就像下面的输出一样,在第 12 次迭代后 f(x3)=0 但 if(fabs(f(x3)==0)) 没有运行。 循环不停止 它不应该进入第 13 次迭代
float f(float x)
{
float f_x;
f_x= pow(x,3)+(3*x)-5;
return f_x;
}
int main(int argc, char** argv)
{
float a,b,tol,x3;
int itr,n;
cout << "enter the iterations";
cin >> itr;
cout << "enter the interval a";
cin >> a;
cout <<"enter the interval b";
cin >> b;
cout << "enter the toleration";
cin >> tol;
cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
cout.precision(5);
//cout<<"fa="<<f(a)<<"fb"<<f(b);
cout<<"nttattbttx3ttf(a)ttf(b)ttf(x3)" <<endl;
if (f(a)*f(b)<0 && a<b)
{
for (n=0;n<itr;n++)
{
x3=a-((b-a)*f(a))/(f(b)-f(a));
cout << "xx"<<fabs(f(x3));
if (fabs( f(x3))==0)
{
cout << "Solution"<<fabs(f(x3));
break;
}
else
{
cout<<n+1 <<"tt"<<a <<"tt"<<b <<"tt"<<x3<<"tt"<<f(a)
<<"t"<<f(b)<<"tt"<<f(x3) <<endl;
if(f(x3)*f(a)<0)
b=x3;
else
if(f(x3)*f(b)<0)
a=x3;
}
}
}
else
cout<< "No Solution Exist";
return 0;
}
输出
进入迭代13
输入间隔 A1
输入区间 B2
进入容忍1
**n a b x3 f(a) f(b) f(x3)**
1 1.00000 2.00000 1.10000 -1.00000 9.00000 -0.36900
2 1.10000 2.00000 1.13545 -0.36900 9.00000 -0.12980
3 1.13545 2.00000 1.14774 -0.12980 9.00000 -0.04487
4 1.14774 2.00000 1.15197 -0.04487 9.00000 -0.01542
5 1.15197 2.00000 1.15342 -0.01542 9.00000 -0.00529
6 1.15342 2.00000 1.15391 -0.00529 9.00000 -0.00181
7 1.15391 2.00000 1.15408 -0.00181 9.00000 -0.00062
8 1.15408 2.00000 1.15414 -0.00062 9.00000 -0.00021
9 1.15414 2.00000 1.15416 -0.00021 9.00000 -0.00007
10 1.15416 2.00000 1.15417 -0.00007 9.00000 -0.00003
11 1.15417 2.00000 1.15417 -0.00003 9.00000 -0.00001
12 1.15417 2.00000 1.15417 -0.00001 9.00000 0.00000
13 1.15417 2.00000 1.15417 -0.00000 9.00000 0.00000
浮点运算有精度误差,所以在大多数情况下最好不要直接比较浮点值,使用 epsilon:
bool float_equal(float a , float b)
{
return std::abs(a-b) < 0.001;
}
请注意,在您的情况下(与零相比),精度更重要:浮点实现被分配以在零附近提供更高的精度。因此,例如,您可以拥有
0,0000000000001 或 0,0000000000000000001 这样的数字,这些数字不被视为等于零。检查此线程以获取更多注意事项:浮点数和双重比较的最有效方法是什么?
此外,请注意,std::setprecision 是一个操纵器,它改变输出(打印)操作的精度,而不是浮点"系统"的精度。
你确定 f(x3) 正好是 0,而不是 - 说 - 0.0000000001 ?
浮点数在 0 左右可能非常准确,有时甚至低至点后的 45 位。
这里的问题不是浮点精度,而是你愿意在结果中接受的容差。在大多数情况下,随着您进行更多的迭代,regula falsi 会让你越来越接近正确的结果,但它不会给你确切的答案。所以你必须做出的决定是,你希望结果有多接近?这是现实世界对准确性的要求和获得结果所需的时间之间的权衡;更高的精度需要更多的计算时间。因此,请选择任务可接受的公差,然后重复循环,直到结果在该容差范围内。如果结果太慢,则必须增加容差。
相关文章:
- 布尔比较运算符是如何在C++中工作的
- 在 c++ 中对字符串进行操作的关系运算符无法按预期工作
- C++编程:运算符重载中的引用如何工作?
- 编译"运算符删除"时C++编译器如何工作?
- C++,()运算符重载,它的工作是什么
- 错误:三元运算符无法在对象中正常工作"cout"
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- C++自定义删除运算符不能正常工作?
- 为什么我的模运算符无法正常工作?
- ostream_iterator运算符=在pair<int,int>上失败,但在包装器类上工作。我不能为成对<>重载运算符<<吗?
- 变量地址的运算符[]是如何工作的
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 如何使用while循环找到GCD?模数运算符是如何工作的
- 让类与运算符一起工作更简单的方法
- 枚举运算符不工作
- 为什么运算符"new"需要指针才能工作?
- 有人可以解释速记赋值运算符的实际工作原理吗?
- 不工作 复制分配运算符
- 返回对象如何与分配运算符一起工作