c++如何判断两个浮点数相等或者大小问题
来源:互联网 发布:linux redmine 安装 编辑:程序博客网 时间:2024/06/15 07:04
SAP的面试题之一:
如何判断两个浮点数是否相等:
例1:
a=1.000001 b=1.0两个数,一般情况下会认为两者相等。一般我们会认为写出代码:
#include "stdafx.h"#include<iostream>#include<string>using namespace std;int main(){double a,b;cout<<"请输入浮点数a和b"<<endl;const double eps=1.0e-6;//设置绝对误差阈值,当两个数绝对误差很小很小的时候,就认为两者相等;while(cin>>a>>b){if(fabs(a-b)<=eps){cout<<"a和b相等"<<endl;}else{cout<<"a和b不相等"<<endl;}}return 0;}
结果:
例2:
a=1000.0001 b=1000.000时,
显然按照上面的程序,两者并不相等,但是按照相对误差(1000.001-1000.00)/1000.000=1.0e-6;所以应该认为两者相等;
于是我们用相对误差改写代码:
#include "stdafx.h"#include<iostream>#include<string>using namespace std;int main(){double a,b;cout<<"请输入浮点数a和b"<<endl;const double eps=1.0e-6;//设置绝对误差阈值,当两个数绝对误差很小很小的时候,就认为两者相等;while(cin>>a>>b){if(fabs(a-b)<=eps*fabs(a))//用相对误差计算,看两者是否相等;{cout<<"a和b相等"<<endl;}else{cout<<"a和b不相等"<<endl;}}return 0;}
两者相等;
但是当输入:
a=0.0000 b=0.0001时,代码//;if(fabs(a-b)<=eps*fabs(a))右端为0;左端不为0;显然是不相等的,所以仍然不能全面判断两个浮点数是否相等;
比较好的方法是将相对误差和绝对误差相结合:
#include "stdafx.h"#include<iostream>#include<string>using namespace std;bool IsEqual(float a,float b ,const double eps,const double releps);int main(){double a,b;cout<<"请输入浮点数a和b"<<endl; bool flag=true;while(cin>>a>>b){double eps=10e-9;//设置绝对误差阈值,当两个数绝对误差很小很小的时候,就认为两者相等;double releps=10e-4;//设置相对误差阈值,当两个数的相对误差很小的时候,认为相等flag=IsEqual(a,b,eps,releps);if(flag==true){cout<<"a b 相等"<<endl;}else{cout<<"a b不等"<<endl;}}return 0;}bool IsEqual(float a,float b , double eps,double releps){if(a==b){return true;}if(fabs(a-b)<eps){ return true;}if(fabs(a-b)<=releps*fabs(a)){return true;}}
结果
如何判断一个浮点数是否为0:
规则:
不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float 还是double 类型的变量,都有精度限制。所以一定要
避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON 是允许的误差(即精度)。
阅读全文
0 0
- c++如何判断两个浮点数相等或者大小问题
- C语言判断两个浮点数是否相等
- 浮点数判断为0或者相等
- 判断两个浮点数是否相等
- 判断两个浮点数是否相等
- 判断两个浮点数是否相等
- 判断两个浮点数是否相等
- 如何比较两个浮点数是否相等?
- 浮点数判断相等
- 不可将两个浮点数 直接做 相等比较判断
- 两个浮点数相等比较
- 比较两个浮点数相等
- 判断浮点数是否相等
- 判断浮点数是否相等
- 判断浮点数是否相等
- 判断浮点数是否相等
- 【经典算法】:如何判断整数和浮点数是否相等
- C语言中浮点数double/float相等判断
- 解决redis集群ruby版本过低
- 【转】linux下杀死进程(kill)的N种方法
- Javascript模块化编程(一):模块的写法
- redis集群的搭建
- Swift基础 扩展
- c++如何判断两个浮点数相等或者大小问题
- 数组的定义
- Xpage数据源
- Add Two Numbers
- mysql 实现主从复制
- myeclipse10热部署jrebel6.5.0
- Burp Suite基础教学 之 Target
- [C/C++]OJ练习题:输出两个带分数的差[格式控制]
- mac OS 系统目录结构