Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中双数据类型的最大精度是多少?_C_Floating Point_Double Precision - Fatal编程技术网

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

C中双数据类型的最大精度是多少?,c,floating-point,double-precision,C,Floating Point,Double Precision,为了比较C中的两个双类型变量,我定义了#define EQUALITY\u 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

为了比较C中的两个双类型变量,我定义了
#define EQUALITY\u 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
}

我面临的问题是,我的代码中的分数非常小,因此对于
相等性\u EPSILON=1e-8
,比较结果在某些情况下是相等的。我的问题是,我可以将ε设置为多小?

你不应该对ε使用绝对值。所选的值应与正在比较的值相对

例如,可以将最小值(最接近零)除以一百万,然后使用该值的绝对值


这是否是一个合适的选择取决于执行了哪些操作以达到这些值。它可能不适用于所有情况。

浮点数不是均匀分布在数字行上的。它们在0附近非常密集,随着震级的增加,两个可表达值之间的“增量”增加:

                               0
|      |     |    |   |  |  | ||| |  |  |   |    |     |      |
这意味着,对于较小的数字,需要使用较小的“ε”

编辑:并且您允许的错误或epsilon应该与您在比较的值中已经预期的错误在同一范围内。即,由于产生它们的浮点操作而产生的错误。请参阅下面的注释了解原因。/EDIT

您需要使用的“ε”类型的一个合理指示可以从
math.h
中获得:

nextafter(x,y)
沿编号线沿
y
方向移动时,返回
x
之后的下一个可表示值


另一种方法是计算
img_分数[i]
img_分数[j]
之间的幅度差异,并观察它与
img_分数[i]
img_分数[j]
的幅度相比有多小。小多少?您需要决定。

双精度的最小绝对值为2^{-1023},约为10^{-308}。但是只有53位用于存储尾数(有效数字所在的部分)。如果你事先知道差值的近似值,那么你的ε几乎可以低到差值的2^{-53}倍。如果您事先不知道,您可能应该根据其中一个差异的百分比构建您的ε


请注意,下降到2^{-53}倍的差异是由于双精度中的有限精度造成的限制。如果要减去的两个值彼此非常接近,以致其差值中的有效位少于53位,则ε只能低至差值的2^{-x}倍,其中x是差值中的有效位数。

是否考虑过使用相对ε?必须读取:浮点值中的错误取决于以前的操作。确定可接受的错误阈值需要分析之前的操作(错误可能有多大)和比较的目的(可以容忍的错误有多大)。如果没有更多的信息,这个问题不可能给出正确的答案。谢谢。你能澄清一下你说“最小的”是指什么吗?@president\u geek:很好。我指的是最小绝对值:最接近零,而不是最接近负无穷大。明白了,再次感谢。此外,如果我不需要相等性检查,那么直接比较就可以了,比如
if(img_分数[I]>img_分数[j])
,如果你要做这种愚蠢的epsilon比较,epsilon的值应该是
(fabs(a)+fabs(b))*DBL_EPSILON*K
其中
K
是一个小常数,大致对应于计算
a
b
时发生的舍入步数。被比较的数字的大小,以及该区域中浮点数的间距,与先前操作产生的误差大小无关。这个问题没有给出限制误差的信息,因此无法提供关于如何补偿误差的可靠建议。谢谢Arjun!如果我不需要平等性检查,那么像
If(img_分数[I]>img_分数[j])
这样的直接比较也应该正常吗?@pressed_geek是的,会的。当然,所有的比较都是“正确”的。因此,如果一个值大于该值(即使差值小于或等于
nextafter),它将显示为
。被比较的数字的大小以及该区域中浮点数字的间距与先前操作产生的错误大小无关。“这个问题没有提供限制错误的信息,因此无法提供关于如何补偿错误的可靠建议。”强调的怪人-上述评论使我认为你应该重新考虑你的问题。从本质上说,埃里克·波斯特希尔所说的是正确的。您必须考虑FP算法产生的错误类型。