double(浮点数比较大小)
浮点数不是不可以使用 “==”符号比较大小吗? 为什么这里使用这种比较方法也可行呢?
同问,作者的所有number类型判定是否相等都是用EXPECT_EQ_BASE宏,而double类型数字显然不是精确的。这样测试可以吗?
同问,这样的测试可以吗。
fabs(expect - actual) < (EPS)
我一直是这么比较大小的
我觉得这样比较是没有问题的。
因为在我们的测试场景中,是先在代码中写好一个 double literal, 比如 double d = 3.14159;,但是编译器在处理源代码时,仍然是需要用某种方式,将我们代码中的 3.14159 这个字符串转换成二进制形式的浮点数表示,这种转换方式很可能就是 strtod。
另一方面,我们又写了一个 string litral, char* s = "3.14159",编译器先将它以字符数组的形式保存,然后我们将这个字符数组传给我们的lept_parse_number函数,最终传给 strtod函数,strtod 对其做解析,返回一个 double。
所以说,在一个测试用例中,只是一个同样的字符串经过了两次 strtod 的操作而已,他们的结果当然会相同。因此,直接用 == 判断是没有问题的。
为了验证我的判断,我写了一小段代码:
#include<stdio.h>
#include<stdlib.h>
typedef unsigned char * byte_ptr;
void show_bytes(byte_ptr start,int len){
for(int i=0;i<len;i++)
printf(" %.2x",start[i]);
printf("\n");
}
void show_double(double d){
show_bytes((byte_ptr)&d,sizeof(d));
}
int main(void){
show_double(1.0);
show_double(strtod("1.0",NULL));
show_double(3.1415926);
show_double(strtod("3.1415926",NULL));
// to be continued...
}
打印的结果显示,两者的二进制表示是完全一样的。 理解可能有误,欢迎指正。
这里从字符串解析成浮点数是精确的,浮点数没有进行数学运算所以没有截断误差
直接比较还是有问题的,特别是对于比较极端的数值,即使打印出来一样
#include<float.h> fabs(expect - actual) < (DBL_EPSILON) 效果不错