标签:const double 浮点数 Equ eps 笔记 C++ 0.00 define
判断是否相等
因为一个浮点数的存储并不总是精确的,例如在经过大量计算之后可能会将3.14
保存为3.1400000000001
或者3.1439999999999
,这时候如果直接用==
来比较这两个数的话会输出错误的结果,false
(C++中==
只有在两个数字完全相同的情况下才判定为true)。所以需要引入极小数eps
来修正,只要不超出这个误差,那么就判定为true
。
通常定义一个eps
为常量1e-8
:
const double eps = 1e-8;
对应的定义判定是否相等的操作Equ
:
#define Equ(a, b) ((fabs((a)-(b))<(eps))
上面这行代码是通过宏定义来定义出一个名为Equ
的函数,这个函数会将a和b相减,如果相差的结果的绝对值小于极小值eps,那么就判定为true,否则为false。上面加这么多括号是为了防止宏定义可能带来的错误,不能够省略掉。相对应的,如果需要使用不等于,那么只需要用!Equ(a, b)
即可。
使用上述函数的例子:
#include <stdio.h>
#include <math.h>
const double eps = 1e-8;
#define Equ(a,b) ((fabs((a) - (b)) < (eps))
int main(){
double db = 1.23;
if(Equ(db, 1.23)){
printf("equal");
}
else{
printf("not equal")
}
return 0;
}
大于
#define More(a,b) (((a) - (b)) > (eps))
小于
#define Less(a,b) (((a)-(b)) < (-eps))
大于等于
#define MoreEqu(a,b) (((a)-(b))>(-eps))
小于等于
#define LessEqu(a,b) (((a)-(b))<(eps))
补充:圆周率
\(\cos{\pi} = -1\), \(\pi = \arccos{-1}\),所以:
const double Pi = acos(-1.0);
与误差相关的补充
另外还有:
- 在经过大量计算后可能因为误差的累计,一个变量中存储的0实际上是一个非常小的负数,如果这时候对这个变量进行开根号操作
sqrt
,那么会报错(asin(x)
类似,当存放的x
为+1或-1时也会出现类似的情况)。因此需要用eps来保证变量在定义域内; - 一些编译环境下0.00的变量可能在输出时会变成-0.00。这是一个bug,只能将结果放在字符串中然后和-0.00比较,如果对比成功那么将结果加上eps来变回0.00 。
参考
《算法笔记》胡凡著
标签:const,double,浮点数,Equ,eps,笔记,C++,0.00,define 来源: https://www.cnblogs.com/yejianying/p/cpp_notes_5.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。