首页 > 解决方案 > 当 dif==0 时,该过程将停止,但当 dif==-0.000000 时,它不会停止

问题描述

我正在尝试编写一个程序来编写一个分数m/n作为不同埃及分数(EFs)的总和,EFs 数量最少。

这是我的完整代码:

#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但过程并没有结束!

输出说明:

我试图修复它,但我所有的努力都是徒劳的。你知道我应该在我的代码中改变什么吗?

任何帮助将不胜感激!

标签: c++floating-point

解决方案


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

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

并使用它:

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

推荐阅读