c++ - 当 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
但过程并没有结束!
输出说明:
我试图修复它,但我所有的努力都是徒劳的。你知道我应该在我的代码中改变什么吗?
任何帮助将不胜感激!
解决方案
浮点比较通常不起作用,因为==
意味着“完全为零”,而您只关心它“足够接近”为零。编写一个函数来检查循环终止:
bool isNear(float f, float g) {
return abs(f-g)<=((abs(f)+abs(g))/1e8);
}
并使用它:
while (!isNear(sum, a/b)) …
推荐阅读
- makefile - Makefile 通过覆盖构建变量来共享目标
- java - 当我从 google play 下载我的应用程序时,我无法获得广告
- laravel - 如何在 laravel 5.6 中找到不同用户的最大总和值?
- python - 查找数组中的最小数
- intellij-idea - Intellij:是否有使“运行任何东西”对话框内容更宽的选项或配置?
- tabs - AMP setState 在服务器中无法正常工作
- c# - 找不到与命令“dotnet-/app/Build\ClearPluginAssemblies.dll” Docker 匹配的可执行文件
- go - “i.(string)”在 golang 语法中的实际含义是什么?
- java - 在 ArrayList 中添加/删除方法与设置方法
- javascript - React 使用新项目更新列表,但 ID 可能会重复