代码之家  ›  专栏  ›  技术社区  ›  Finley

澄清求解2*2实矩阵特征向量时机器ε的影响

  •  0
  • Finley  · 技术社区  · 7 年前

    代码来自函数 eigen2x2

    double u = (a + c)*0.5;
    double v = std::sqrt((a - c)*(a - c)*0.25 + b*b);
    double l1 = u + v; //the 1st eigenvalue
    double l2 = u - v; // the 2nd eigenvalue
    

    l1 ,这意味着解决以下系统:

    eigen2x2 详情如下:

            double x = b;
            double y = l1 - a;
            double e = fabs(x);
    
            if (e + fabs(y) < 1e-4)
            {
                y = b;
                x = l1 - c;
                e = fabs(x);
                if (e + fabs(y) < 1e-4)
                {
                    e = 1. / (e + fabs(y) + FLT_EPSILON);
                    x *= e, y *= e;
                }
            }
    
            double d = 1. / std::sqrt(x*x + y*y + DBL_EPSILON);
            double x1 = x*d; //I moderately changed variable name for simplicity.
            double x2 = y*d;   
    

    哪里 x1 x2 构造对应于 .

    问题

            e = 1. / (e + fabs(y) + FLT_EPSILON);
            x *= e, y *= e;
    

    那么它扮演的角色是什么呢?允许踢出去吗 FLT_EPSILON DBL_EPSILON ?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Yakk - Adam Nevraumont    7 年前

    它们的存在是为了防止被零(或亚ε值)除。相反,你会得到一个大的浮动。

    假设你的价值观是适度的,那么它对结果几乎没有影响;比其他舍入效应小。

    安全地删除它需要编写广泛的单元测试的一些子集,找到最初添加它的记录案例,或者在各种各样的实时代码中广泛使用,在这些代码中,不良行为是安全的(没有金钱声誉或生命危险),但仍然可以注意到。单元测试需要覆盖一系列小的、零的、非规范化的值与中的和大的值混合,包括白盒反向工程,以在每个中间步骤(为了安全)生成所述值。

    推荐文章