当dif == 0时该过程将停止,但是当dif ==-0.000000时该过程不会停止

时间:2018-10-13 16:01:25

标签: c++ floating-point

我正在尝试编写一个程序,将分数m/n写为具有最小数量EF的不同埃及分数(EF)的总和。

这是我的完整代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    float a,b,sum=0,sct[100000];
    float arr=1; 
    int stt=0;
    cin>>a>>b;
    while(sum!=a/b){  
        sum=sum+(1/arr);
        float dif=a/b-sum;
        printf("%f - sum = %f - dif = %f\n",arr,sum,dif);
        if(dif>=0){
            sct[stt]=arr;
            cout<<"1/"<<arr<<"\n"; 
            stt++;
        } else {  
            sum=sum-(1/arr);
        }
        arr++;
    }
    cout<<stt<<"\n";
    for(int m=0;m<stt;m++) cout<<sct[m]<<" ";
}

您可以很好地看到,如果dif==0,该过程将结束。但是当arr==3时,我得到dif==-0.000000,但是过程并没有结束!

输出标题:

我试图修复它,但是我所有的努力都没有用。您知道我应该在代码中进行哪些更改吗?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

浮点比较通常不起作用,因为==的意思是“完全为零”,而您只关心它“足够接近”为零。编写一个函数来检查循环终止:

bool isNear(float f, float g) {
  return abs(f-g)<=((abs(f)+abs(g))/1e8);
}

并使用它:

while (!isNear(sum, a/b)) …