我正在尝试编写一个程序,将分数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
,但是过程并没有结束!
输出标题:
我试图修复它,但是我所有的努力都没有用。您知道我应该在代码中进行哪些更改吗?
任何帮助将不胜感激!
答案 0 :(得分:1)
浮点比较通常不起作用,因为==
的意思是“完全为零”,而您只关心它“足够接近”为零。编写一个函数来检查循环终止:
bool isNear(float f, float g) {
return abs(f-g)<=((abs(f)+abs(g))/1e8);
}
并使用它:
while (!isNear(sum, a/b)) …