function tql2()

in benchmarks/JetStream2/ARES-6/ml/index.js [4993:5099]


    function tql2(n, e, d, V) {

        var g, h, i, j, k, l, m, p, r,
            dl1, c, c2, c3, el1, s, s2,
            iter;

        for (i = 1; i < n; i++) {
            e[i - 1] = e[i];
        }

        e[n - 1] = 0;

        var f = 0,
            tst1 = 0,
            eps = Math.pow(2, -52);

        for (l = 0; l < n; l++) {
            tst1 = Math.max(tst1, Math.abs(d[l]) + Math.abs(e[l]));
            m = l;
            while (m < n) {
                if (Math.abs(e[m]) <= eps * tst1) {
                    break;
                }
                m++;
            }

            if (m > l) {
                iter = 0;
                do {
                    iter = iter + 1;

                    g = d[l];
                    p = (d[l + 1] - g) / (2 * e[l]);
                    r = hypotenuse(p, 1);
                    if (p < 0) {
                        r = -r;
                    }

                    d[l] = e[l] / (p + r);
                    d[l + 1] = e[l] * (p + r);
                    dl1 = d[l + 1];
                    h = g - d[l];
                    for (i = l + 2; i < n; i++) {
                        d[i] -= h;
                    }

                    f = f + h;

                    p = d[m];
                    c = 1;
                    c2 = c;
                    c3 = c;
                    el1 = e[l + 1];
                    s = 0;
                    s2 = 0;
                    for (i = m - 1; i >= l; i--) {
                        c3 = c2;
                        c2 = c;
                        s2 = s;
                        g = c * e[i];
                        h = c * p;
                        r = hypotenuse(p, e[i]);
                        e[i + 1] = s * r;
                        s = e[i] / r;
                        c = p / r;
                        p = c * d[i] - s * g;
                        d[i + 1] = h + s * (c * g + s * d[i]);

                        for (k = 0; k < n; k++) {
                            h = V[k][i + 1];
                            V[k][i + 1] = s * V[k][i] + c * h;
                            V[k][i] = c * V[k][i] - s * h;
                        }
                    }

                    p = -s * s2 * c3 * el1 * e[l] / dl1;
                    e[l] = s * p;
                    d[l] = c * p;

                }
                while (Math.abs(e[l]) > eps * tst1);
            }
            d[l] = d[l] + f;
            e[l] = 0;
        }

        for (i = 0; i < n - 1; i++) {
            k = i;
            p = d[i];
            for (j = i + 1; j < n; j++) {
                if (d[j] < p) {
                    k = j;
                    p = d[j];
                }
            }

            if (k !== i) {
                d[k] = d[i];
                d[i] = p;
                for (j = 0; j < n; j++) {
                    p = V[j][i];
                    V[j][i] = V[j][k];
                    V[j][k] = p;
                }
            }
        }
    }