版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Wchenchen0/article/details/82793695
由于计算机中采用有限位的二进制编码,因此浮点数在计算机中的存储并不总是精确的。
例如在经过大量的计算后,一个浮点型的数3.14在计算机中就可能存储成3.1400000000001,可能存储为
3.13999999999999,(因为==是完全相等才能判断为true)。于是需要引入一个极小的eps来对这种误差进行修改。
1.等于运算符(==)
a在区间内就可以判断true;
问题是eps取多少?
经验表明 eps取1e-8的一个合适的数字,对大多数不会漏判或者误判
#define Equ(a,b) (fabs((a)-(b))<(eps))
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const double eps = 1e-8;
#define Equ(a,b) (fabs((a)-(b))<(eps))
int main()
{
double db = 1.12;
if (Equ(db, 1.12)) {
cout << "fdafsdf" << endl;
}
else cout << "no" << endl;
return 0;
}
这个其实吧db换成1.12同样还是会输出true.其实像这种比较简单的比较情况是可以忽视误差的(事实上,如果没有经过容易损失精度的计算,就不需要考虑误差,可以直接比较),但当一个变量进行了误差较大的运算后,精度的损失就不可无视了。
例如:
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main()
{
double db1 = 4 * asin(sqrt(2.0) / 2);
double db2 = 3 * asin(sqrt(3.0) / 2);
if (db1 == db2) cout << "true" << endl;
else cout << "false" << endl;
return 0;
}
输出结果:
false
应该结果都是π的可是输出了false;而是使用了Qqu函数就会输出true
2.大于运算符(>)
如果一个数a要大于b,那么必须在误差eps的扰动范围之外大于b,因此只有大于b+eps的数才能判定为大于b(也即a减b大于eps)
#define More(a,b) (fabs((a)-(b))>(eps))
3.小于运算符(<)
#define less(a,b) (fabs((a)-(b))<(-eps))
这个是和>的理解是一样的道理
4,大于等于运算符(>=)
由于大于等于运算符可以理解为大于运算符和等于运算符的结合,于是需要让一个数a在误差扰动范围内能够判定其大于或者等于b,因此大于b-eps的数都应当判定为大于等于b(也即a-b>-eps)
#define MoreEque(a,b) (fabs((a)-(b))>(-eps))
5.小于等于运算符(<=)
和>=理解的思路一样
#define LessEque(a,b) (fabs((a)-(b))<(eps))
6,圆周率π
acos(-1);
特别的:
可以用eps来修正精度问题