1. C++ / Говнокод #3430

    +158

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    double** QRSLAU_check(matrix n1, matrix n0, double eps){
        double** x;
        x = (double**) calloc(2,sizeof(double*));
        x[0]= (double*) calloc(n1.i,sizeof(double));
        x[1]=(double*) calloc(n1.i,sizeof(double));
        for (int a=0; a<n1.i; a++){ x[0][a]=1; x[1][a]=1;}
    
        for (int a=0; a<n1.i; a++)
            for (int b=a+1; b<n1.i; b++)
                if(n1.M[b][a]>eps || n1.M[b][a]<-eps) x[0][a]=0;
        for (int a=0; a<n1.i-1; a++)
            if(((n1.M[a][a]+n1.M[a+1][a+1])-(n0.M[a][a]+ n0.M[a+1][a+1]))>eps ||
               ((n1.M[a][a]+n1.M[a+1][a+1])-(n0.M[a][a]+ n0.M[a+1][a+1])) <-eps ||
               ((sqrt(-(n1.M[a][a]*n1.M[a][a]+ n1.M[a+1][a+1]*n1.M[a+1][a+1]-2*n1.M[a+1][a+1]*n1.M[a][a]+4*n1.M[a][a+1]*n1.M[a+1][a])))-
                (sqrt(-(n0.M[a][a]*n0.M[a][a]+ n0.M[a+1][a+1]*n0.M[a+1][a+1]-2*n0.M[a+1][a+1]*n0.M[a][a]+4*n0.M[a][a+1]*n0.M[a+1][a]))))>eps ||
               ((sqrt(-(n1.M[a][a]*n1.M[a][a]+ n1.M[a+1][a+1]*n1.M[a+1][a+1]-2*n1.M[a+1][a+1]*n1.M[a][a]+4*n1.M[a][a+1]*n1.M[a+1][a])))-
                (sqrt(-(n0.M[a][a]*n0.M[a][a]+ n0.M[a+1][a+1]*n0.M[a+1][a+1]-2*n0.M[a+1][a+1]*n0.M[a][a]+4*n0.M[a][a+1]*n0.M[a+1][a]))))<-eps){
            x[1][a]=0;
            if(a==n1.i-2)x[1][a+1]=0;
        }
        else a++;
        return x;
    }

    какая-та штука для QR-алгоритма и поиска собственных значений

    Запостил: Shiz89, 09 Июня 2010

    Комментарии (10) RSS

    • Это чистый цэ, иначе нахрена мутить порно с (double**) calloc(2,sizeof(double*)), когда есть порно с std::vector<>
      Ответить
      • Во всяком случае, это не C89, т.к. в нём нельзя определять переменную внутри for().

        К тому же намного больше проблемы от того, что внутри цикла используется sqrt() и двойное сравнивание, вместо использования fabs(). Лучше б возвели eps в квадрат, чем брать sqrt() от чего-либо. (хотя с другой стороны надо надеяться, что eps не настолько мал, чтобы это привело к неприятным последствиям)
        Ответить
        • IMHO
          Ответить
        • А толку здесь возводить погрешность в квадрат? Это ж вроде как такое сравнение с нулем (с машинным Эпсилон).
          Вот что по 2 раза одно и то же считается, это да.
          Ответить
          • Лично у нас в институте на численных методах мы обычно используем точность не сильнее чем 1e-12. И т.к. машинный эпсилон известен зарание, а eps всё-таки задаётся переменной, я предположил, что тут похожий случай.
            Ответить
        • Внутрь цикла не смотрел. Даа, автор молодец...

          > что eps не настолько мал, чтобы это привело к неприятным последствиям

          1E-3000?
          Ответить
      • забыл указать, что человек использовал QT, тогда использование такого "стиля" становится более чем бредовым
        Ответить
    • Тут какахи, видимо, в ифах:
      if ((bla-bla-bla) > eps || (bla-bla-bla) < -eps)
      Ответить
    • А нахера ему мутить двумерный массив, где один из индексов имеет всего два значения? вернул бы свою пару векторов по указателю в параметрах вызова функции.
      Ответить
    • показать все, что скрытоА нахера ему мутить двумерный массив, где один из индексов имеет всего два значения? вернул бы свою пару векторов по указателю в параметрах вызова функции.
      Ответить

    Добавить комментарий