c - double 的推荐最小 epsilon 是多少?

标签 c floating-accuracy

我正在尝试用 C 语言创建一个高斯消除器。为此,我不时需要检查矩阵是否在数值上是奇异的:如果某个数字( double )非常非常非常小。

我的问题是,如果我尝试这样做:

if(0 == matrix->items[from]){
        fprintf(stderr,"Matrix is still singular after attempting pivot. Exitig.\n");
}

这永远不会产生 true。由于 double 的不准确性,它永远不会恰好为 0。但是,当尝试运行程序时,像这样的情况会用 inf 或 NaN 填充数字,具体取决于是用它乘法还是除法及其组合。

为了过滤这些,我需要这样的东西:

#define EPSILON very_small
// rest of the code
if(matrix->items[from] < EPSILON){
     ...singular
}

此 EPSILON 的推荐值是多少?是 double 的绝对精度,还是更大一点的值?

顺便说一句,哪个更好,像上面那样将其定义为宏,或者像这样使用它:

const double EPSILON = ...;

抱歉,如果我不够清楚,英语不是我的母语。

感谢您的回复。

最佳答案

I need to check whether a matrix is numerically singular

通常这是通过防止 double 溢出来检测的。

// Check if 1.0/determinant will overflow.
if (fabs(determinant) <= 1.0/(0.99*DBL_MAX)) {
  Handle_Singular_Case()
} else {
  one_over_det = 1.0/determinant;
}

使用DBL_EPSILON(示例:2e-16)通常是错误的解决方案。 double 数学需要相对 比较以确保良好的计算远离 1.0 震级。

// Rarely the right thing to do.
#define EPSILON DBL_EPSILON
if(fabs(matrix->items[from]) < EPSILON){

然而这是非常上下文敏感的@Weather Vane .


然而 OP 的真正问题肯定在这里:“当尝试运行程序时,像这样的情况会用 inf 或 NaN 填充数字,具体取决于是乘法还是除法及其组合。”。可以使用各种技术来避免此问题,例如使用 partial pivoting 进行消除.

要解决那个问题,最好发布代码和示例数据。

关于c - double 的推荐最小 epsilon 是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42913943/

相关文章:

无法将数组值排入队列

java - 高效计数器 float 错误

C++ 浮点截断和设置精度逻辑错误

c++ - sprintf(buf, "%.20g", x)//buf应该多大?

java - 如何用浮点运算解决精度误差

c++ - 这会累积多少浮点错误?

c - 未定义的行为?

c - 用C读取文件时出现问题

c - strcat 实现

关闭客户端套接字并保持服务器套接字处于事件状态