浮点数的比较

版权声明:本文为博主原创文章,未经博主允许不得转载。 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来修正精度问题

猜你喜欢

转载自blog.csdn.net/Wchenchen0/article/details/82793695