一、定义
在iOS
工程中,打开float.h
头文件,找到下面的定义
![](https://img.haomeiwen.com/i2038175/d7964fba73964a76.png)
FLT_EPSILON
和__FLT_EPSILON__
是一个意思,表示的是float
类型(单精度浮点数)所能识别的最小精度。DBL_EPSILON
和__DBL_EPSILON__
表示的是double
类型所能识别的最小精度,LDBL_EPSILON
和__LDBL_EPSILON__
表示的是long double
类型所能识别的最小精度;它们常用于比较当中:
double a = 0.5;
if (a == 0.5) {
NSLog(@"a = 0.5是正确的。");
} else {
NSLog(@"a = 0.5不是正确的。");
}
NSLog(@"a的值为: %f", a);
double b = sin(M_PI / 6.0);
if (b == 0.5) {
NSLog(@"b = 0.5是正确的。");
} else {
NSLog(@"b = 0.5不是正确的。");
}
NSLog(@"b的值为:%f", b);
第一个比较正确,因为0.5
在double
类型的存储精度范围内;
第二个比较可能正确也可能错误,结果取决于处理器、编译器的版本和设置;
二、用法
上面比较b
的正确方法应该是这样:
double b = sin(M_PI / 6.0);
if (fabs(b - 0.5) < DBL_EPSILON) {
NSLog(@"b = 0.5是正确的。");
} else {
NSLog(@"b = 0.5不是正确的。");
}
NSLog(@"b的值为:%f", b);
同样的,FLT_EPSILON
和LDBL_EPSILON
也是这样使用。
三、总结
1.EPSILON
是最小误差,是EPSILON+X
不等于X
的最小的正数;
2.在比较浮点数的时候,一定要注意精度的问题;
网友评论