C中双数据类型的最大精度是多少?

str*_*eek 3 c floating-point double-precision

为了比较C中的两个双重类型变量,我已经定义了#define EQUALITY_EPSILON = 1e-8.我正在进行如下比较:

if((img_score[i] - img_score[j]) >= EQUALITY_EPSILON){
    // handle for ith score greater than jth score
}
else if((img_score[j] - img_score[i]) >= EQUALITY_EPSILON){
    // handle for ith score smaller than jth score
}
else{
    // handle for ith score equal to jth score
}
Run Code Online (Sandbox Code Playgroud)

我面临的问题是我的代码中的分数非常小,因此EQUALITY_EPSILON = 1e-8,在某些情况下,比较的结果证明是相等的.我的问题是我可以设置多小EQUALITY_EPSILON

Arj*_*kar 13

浮点数不会均匀地分布在数字线上.它们在0附近非常密集,随着幅度的增加,两个可表达值之间的"delta"增加:

                               0
|      |     |    |   |  |  | ||| |  |  |   |    |     |      |
Run Code Online (Sandbox Code Playgroud)

这意味着,对于较小的数字,您需要使用较小的"epsilon".

(编辑:和错误,或ε你允许应该在相同的范围内,你已经期待你是比较值的误差,即由于产生它们的浮点运算错误请参阅下面的评论为什么./编辑).

那种"小量"你需要使用可以从具有一个公平的指示nextaftermath.h:

nextafter(x, y)x当沿着数字线行进时,返回下一个可表示的值y.

另一种方法是计算img_score[i]和之间的大小差异img_score[j],并看看它与img_score[i]或的大小相比有多小img_score[j].多小了?你需要决定.

  • @stressed_geek是的,它会的.当然,所有比较都"正确"进行.因此,如果一个值更大(即使是`nextafter`值差异),它将显示为`>`. (2认同)