(0).我们来看一个程序

#include <stdio.h>

int main(){
	double a;
	scanf("%lf",&a);
	printf("a = %lf",a);
	if(4.6 / 2 == a){
		printf("equal!\n");
	}
	else{
		printf("not equal!\n");
 	}
} 
(1)运行结果


浮点数比较_编程

可以看出,我们输入的2.3和计算出来的(4.6 / 2)相等,这个没有问题。但是如果遇到下面这个问题:


(3)我们再来看一段程序:

#include <stdio.h>
#include <math.h>

#define eqs 1e-8
#define equal(a,b) ( (fabs((a) < (b))) < (eqs))
int main(){

	double a = 4*asin(sqrt(2.0) / 2);
	double b = 3*asin(sqrt(3.0) / 2);
	if(a == b)	printf("eauql!\n");
	else	printf("not equal!\n");
	
	if(equal(a,b))	printf("equal!\n");
	else		printf("not equal!\n");
} 

(4)运行结果

浮点数比较_编程_02

什么!?运行结果竟然出现“not equal”和“equal!”这是怎么回事儿?

(5)总结
a.这是因为在存储浮点数的时候,并不是按照我们想象中那么存储的,比如对于数浮点数2.3,可能存储的结果是:2.2999……99或者是2.3000……001,但就不会是2.300000</p><p>我们来看一个小实验:
浮点数比较_编程_03
就可以看到这里的浮点数2.3存储结果却是2.299……998!=2.3
b.正是因为这么一点小误差,导致在最后计算的时候,出现了不能判断是否真的具有相等的性质。
c.那么我们该怎么判断两个实际相等的数呢?请看下面的这个程序:
#define eqs 1e-8
#define equal(a,b) ( (fabs((a) < (b))) < (eqs))
这里的fabs()是C语言中求解绝对值函数。我们只要设定一个阈值,就可以解决浮点数的比较问题,一般这个阈值设置为1e-8
c.这里的fabs()函数是求绝对值的函数。