C++ == 运算符不工作

C++ == operator not working

本文关键字:工作 运算符 C++      更新时间:2023-10-16

>我正在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 会让你越来越接近正确的结果,但它不会给你确切的答案。所以你必须做出的决定是,你希望结果有多接近?这是现实世界对准确性的要求和获得结果所需的时间之间的权衡;更高的精度需要更多的计算时间。因此,请选择任务可接受的公差,然后重复循环,直到结果在该容差范围内。如果结果太慢,则必须增加容差。