C中的双重比较

时间:2015-08-06 09:10:26

标签: c double gsl

通过以下方式从gsl_vector获取检查器(double类型)数组。

for (i=0; i<M; i++)
{               
    checker[i] = (double)gsl_vector_get(check, i);
    printf(" %f", checker[i]);
}

在上述操作之后,数组检查器有[ 3.000000 -3.000000 -11.000000 -5.000000 ]个元素(来自上述程序的输出)。

我现在面临一个奇怪的问题。

for (i=0; i<M; i++)
{
    printf("checker: %f\n", checker[i]);        
    if(checker[0] == 3.00)
    {           
        printf("Inside If: %f\n", 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_vector_get(check,i)时,上述问题就消失了。检查值来自dgmev函数,其中矩阵和向量相乘。

由于

1 个答案:

答案 0 :(得分:2)

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

  

[sign] [尾数] * 2 [指数]

当内存空间较小时,会出现舍入或相对错误。

来自wiki

  

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

enter image description here

IEEE 754标准将binary32指定为:

Sign bit: 1 bit
Exponent width: 8 bits
Significand precision: 24 bits (23 explicitly stored)
  

这从 6到9有效十进制数字精度(如果a   最多6个有效小数的十进制字符串转换为IEEE   754单精度然后转换回相同的数量   有效小数,则最终字符串应与原始字符串匹配;   如果IEEE 754单精度转换为十进制字符串   至少有9个有效小数,然后转换回单个,   那么最终的数字必须与原来的[4]相匹配。

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

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

What Every Computer Scientist Should Know About Floating-Point Arithmetic

  

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