C语言中的双重比较

C语言中的双重比较,c,double,gsl,C,Double,Gsl,通过以下方式从gsl_向量获得(双类型)检测器阵列 for (i=0; i<M; i++) { checker[i] = (double)gsl_vector_get(check, i); printf(" %f", checker[i]); } 上述代码输出 checker: 3.000000 checker: -3.000000 checker: -11.000000 checker: -5.000000 如图所示,的if循环内的for

通过以下方式从gsl_向量获得(双类型)检测器阵列

for (i=0; i<M; i++)
{               
    checker[i] = (double)gsl_vector_get(check, i);
    printf(" %f", checker[i]);
}
上述代码输出

checker: 3.000000
checker: -3.000000
checker: -11.000000
checker: -5.000000
如图所示,的
if
循环内的
for
未执行。有什么问题吗

编辑:当我直接将
[3.000000-3.000000-11.000000-5.000000]
复制到检查器数组中而不是
gsl\u vector\u get(check,I)
时,上述问题就消失了。检查值来自
dgmev
函数,其中矩阵和向量相乘


谢谢

浮点数可能以以下形式表示:

[签名][尾数]*2[指数]

因此,当内存中的空间较少时,会出现舍入或相对错误

发件人:

单精度浮点格式是一种计算机数字格式,在计算机内存中占用4字节(32位),并通过使用浮点来表示广泛的动态值范围

IEEE 754标准规定二进制32具有:

Sign bit: 1 bit
Exponent width: 8 bits
Significand precision: 24 bits (23 explicitly stored)
这给出了从6到9位有效十进制数字的精度(如果 最多有6个有效小数的十进制字符串转换为IEEE 754单精度,然后转换回相同数量的 有效小数,则最后一个字符串应与原始字符串匹配; 如果IEEE 754单精度转换为十进制字符串 至少有9位有效小数,然后转换回单位, 那么最终的数字必须与原始的[4]匹配

更大(更多位)的浮点表示允许更高的精度

浮点数学不精确。像0.1这样的简单值不能用二进制浮点数精确表示,而浮点数的有限精度意味着操作顺序的细微变化可能会改变结果。A必须阅读:

IEEE标准将异常分为5类:溢出、下溢、零除、无效操作和不精确。每类异常都有一个单独的状态标志。前三个例外的含义不言而喻。无效操作包括表D-3中列出的情况,以及涉及NaN的任何比较


我希望dupe将解决您的问题,如果没有,请回复。谢谢。注意:您也有一个输入错误-如果您的
条件是检查
checker[0]
而不是
checker[i]
@michel slm:那不是输入错误,我只是检查第一个元素。@re3el用大量的小数打印您的值(如
%.50f
)您将看到为什么不存在相等值。@re3el如果«添加精度条件»,您的意思是将绝对差与“阈值”进行比较,则是的。您应该做的是类似于
if(abs(checker[0]-3)<1e-6)
(如果需要,您可以更改
1e-6
,只要您保持足够大的值以避免浮点问题)。
Sign bit: 1 bit
Exponent width: 8 bits
Significand precision: 24 bits (23 explicitly stored)