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".
(编辑:和错误,或ε你允许应该在相同的范围内,你已经期待你是比较值的误差,即由于产生它们的浮点运算错误请参阅下面的评论为什么./编辑).
那种"小量"你需要使用可以从具有一个公平的指示nextafter
在math.h
:
nextafter(x, y)
x
当沿着数字线行进时,返回下一个可表示的值y
.
另一种方法是计算img_score[i]
和之间的大小差异img_score[j]
,并看看它与img_score[i]
或的大小相比有多小img_score[j]
.多小了?你需要决定.
归档时间: |
|
查看次数: |
2014 次 |
最近记录: |