今天读程序,突然发现判断浮点数相等不用“=”,以前没注意,在网上搜了下
1》求差:
if (fabs(a - b) < FLT_EPSILON)
{
//执行代码。a==b
}
2》比较:
if(!(a>b||a<b)) //觉得和“==”相同,建议用第一中方案。
{
//执行代码。a==b
}
查看include文件,在float.h头文件中有很多关于浮点数的宏定义:
[quote]#define FLT_EPSILON 1.19209290E-07F
#define LDBL_EPSILON 1.084202172485504E-19[/quote]
这两个宏定义可用来作为float、 long double趋0最小的判断值。即:
#include <float.h>;
double a, b;
if( abs(a-b) < FLT_EPSILON)
参考程序:
#include "stdio.h"
#include <float.h>
#include <math.h>
int main(int argc, char* argv[])
{
volatile double a = 321.0, b = 321.0423;
double result1, result2;
result1 = pow((a + b), 2.0);
result2 = pow(a, 2.0) + 2.0 * a * b + pow(b, 2.0);
if (fabs(result1 - result2) < FLT_EPSILON)
printf("fabs returns equals\n");
if ( ! (result1 < result2 || result1 > result2))
printf("That's funny!\n");
if (result1 == result2)
printf("result1 == result2\n");
else if (result1 > result2)
printf("result1 > result2\n");
else if (result1 < result2)
printf("result1 < result2\n");
else
printf("That's funny too!\n");
return 0;
}
从数学上看,两个结果应该相同,但计算结果却不同,说明运算过程有误差,还是用相减法比较靠谱!
实际实验中,会发现计算机的精确程度很高,如果只是比较最终结果而不是中间量或者是对精度要求不是变态的高,用“==”也行!