千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。
double和float的EPSINON是不同的。ANSI C已经定义了这些常量:
float.h里面有许多关于浮点类型的定义。
如:
FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON
查看include文件,在float.h头文件中有很多关于浮点数的宏定义:
#define FLT_EPSILON 1.19209290E-07F
#define LDBL_EPSILON 1.084202172485504E-19[/quote]
我们自己定义FLT_EPSILON一般定义为const int FLT_EPSILON=1e-6;
这两个宏定义可用来作为float、 long double趋0最小的判断值。即:
#include <float.h>;
double a, b;
if( (a-b) <= FLT_EPSILON || (a-b) >= -FLT_EPSILON)