通过以下方式从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
函数,其中矩阵和向量相乘。
由于
答案 0 :(得分:2)
浮点数可以用以下形式表示:
[sign] [尾数] * 2 [指数]
当内存空间较小时,会出现舍入或相对错误。
来自wiki:
单精度浮点格式是计算机数字格式,在计算机内存中占用 4字节(32位),并使用浮点表示宽动态范围的值。
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的任何比较。