1. Си / Говнокод #7037

    +147

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    ...
    char det(char a[4][4])
    { float det;
    det=a[0][0]*(a[1][1]*(a[2][2]*a[3][3]-a[3][2]*a[2][3])-a[1][2]*(a[2][1]*a[3][3]-a[2][3]*a[3][1])+a[1][3]*(a[2][1]*a[3][2]-a[2][2]*a[3][1]))
    -a[0][1]*(-a[1][0]*(a[2][2]*a[3][3]-a[3][2]*a[2][3])-a[1][2]*(a[2][0]*a[3][3]-a[3][0]*a[2][3])+a[1][3]*(a[2][0]*a[3][2]-a[3][0]*a[2][2]))
    +a[0][2]*(-a[1][0]*(a[2][1]*a[3][3]-a[3][1]*a[2][3])+a[1][1]*(a[2][0]*a[3][3]-a[3][0]*a[2][3])+a[1][3]*(a[2][0]*a[3][1]-a[2][1]*a[3][0]))
    -a[0][3]*(-a[1][0]*(a[2][1]*a[3][2]-a[3][1]*a[2][2])+a[1][1]*(a[2][0]*a[3][2]-a[3][0]*a[2][2])-a[1][2]*(a[2][0]*a[3][1]-a[3][0]*a[2][1]));
    return(det);
    }; 
    ...

    http://otvet.mail.ru/question/59918103/

    Запостил: 1_and_0, 23 Июня 2011

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

    • показать все, что скрытонормальная такая себе оптимизация вычисления определителя.

      если это говно, то повально все реализации алгоритмов кодирования и хэширования ( например http://people.csail.mit.edu/rivest/Md5.c ) тоже говно.
      Ответить
      • А они, фактически, и есть.
        Ответить
        • для алгоритма которым пользуются может быть миллионы раз в секунду было бы говном *НЕ* воспользоватся даже самой мелкой доступной оптимизацией.
          Ответить
          • Алгоритмам хэширования в частных случаях оптимизация противопоказана.
            Ответить
      • Если минор переписать через макрос, то будет уже лучше.
        Ответить
        • C++ macros are evil.
          Ответить
          • Где тут С++ ?
            Тем более что речь об оптимизации любой ценой.
            Ответить
            • >Где тут С++ ?
              Ох, мне мерещится... :(
              Ответить
            • А тут ни слова не сказано об оптимизации любой ценой.

              Просто школяр не знал циклов.
              Ответить
      • На лицо отсутсвие оптимизации, т.как куча повторных вычислений, которые, компилятор, наверняка сам соптимизирует, но, как ни странно, получится более читаемый код. Т.е. ну не будет он по нескольку раз пересчитывать a[1][1], а один раз посчитает и запишет. Человеку тоже было бы так удобнее прочитать, но, если лень подумать, и действительно соптимизировать, то получается такое.
        Ответить
        • a[i][j] в случае матрицы 4х4 - 16. и куда по твоему компилятор эти 16 значений сможет записать? если например регистров хорошо если 8 свободных есть?

          современный компилятор при виде кода выше навярняка прикрутит какие CPU-специфичные SIMD инструкции. соптимизировать руками то можно - но оно будет непортабельно и я сомневаюсь что быстрее того что компилятор сам может сделать.
          Ответить
          • А куда он будет записывать индексы массива? Какой-то странный вопрос... Нам же не нужны все значения из матрицы одновременно...
            Смысл ответа заключался не в том, как компилятор будет оптимизировать (откуда вы знаете, может он RTL сначала создает, и его, или похожий, и его оптимизирует - техник же разных море, но не об том речь), а в том, что код не оптимизирован / оптимизация явно не являлась тут приоритетом.
            Ответить
            • > код не оптимизирован

              ёпрст. а цыклы сами собой развернулись??
              Ответить
              • Оптимизация, это когда после переделывания кода он начинает делать лучше то, для чего его оптимизировали. Я не знаю, как нужно было хуже написать тот же код, чтобы это было его оптимизированой формой :S
                В смысле, само по себе разворачивание цикла может ничего и не дать. Ну, опять же, код не дает никаких оснований предполагать, что автор что-то замерял / проверял, и пришел к такому решению потому, что оно было оптимальнее какого-то другого. В коде нет даже намека на такие действия. Просто человек написал первое, что ему пришло в голову, и нет тут никакого скрытого смысла...
                Ответить
                • >Оптимизация, это когда после переделывания кода он начинает делать лучше то, для чего его оптимизировали.
                  %\
                  Ответить
                  • Ну можно оптимизировать длину кода, а можно время выполнения, а можно объем занимаемой памяти. Т.е. если вы оптимизируете какой-то код, то вы его не просто оптимизиуете, а для чего-то. Ну это если в этом был вопрос...
                    Ответить
        • >Т.е. ну не будет он по нескольку раз пересчитывать a[1][1], а один раз посчитает и запишет.
          Между делом. В этом коде каждый минор второго порядка считается 2 раза, многие из них - неявно, нужно пораскрывать скобочки, перегруппировать. Просто поищите глазами выражение "(a[2][2]*a[3][3]-a[3][2]*a[2][3])".
          А если оптимизировать, то я бы взял Лапласа и SSE-инструкции.
          Ответить
    • Т.е. он берет матрицу из char'ов (байт со знаком в наиболее распространенном случае). Потом считает определитель (кстати произведение char'ов - это по умолчанию char или уже short или int?), преобразует его во float (single float, 32-битный с 24-битной мантиссой в наиболее распространенном случае), а потом - обратно к char'у. Но произведение 4 знаковых char'ов требует 4*(8-1)=28 бит. Т.е. из-за преобразования к типу с плавающей точкой потеряна точность.
      Это победа.
      Ответить
      • Хотите сказать, double решил бы проблему?
        Ответить
      • char промоутится до int, так что произведение-то наверняка посчитает (если где char 9-битный, то там и int 36-битный). Произведение 4 знаковых 8-битных чисел требует 4*(8-1)+1 бит на знак. Да ещё при сложении/вычитании 24 чисел нужно до 5 бит, чтобы не было переполнения. Итого — на результат 34 бита.
        Ответить
        • Справедливо от и до.
          My bad: я увидел только часть ИСТИНЫ.
          Ответить
    • Тут ко всему еще косяки со знаками, если я не забыл линейную алгебру, то должно быть:
      det=a[0][0]*(a[1][1]*(a[2][2]*a[3][3]-a[3][2]*a[2][3])-a[1][2]*(a[2][1]*a[3][3]-a[2][3]*a[3][1])+a[1][3]*(a[2][1]*a[3][2]-a[2][2]*a[3][1]))
      -a[0][1]*(a[1][0]*(a[2][2]*a[3][3]-a[3][2]*a[2][3])-a[1][2]*(a[2][0]*a[3][3]-a[3][0]*a[2][3])+a[1][3]*(a[2][0]*a[3][2]-a[3][0]*a[2][2]))
      +a[0][2]*(a[1][0]*(a[2][1]*a[3][3]-a[3][1]*a[2][3])-a[1][1]*(a[2][0]*a[3][3]-a[3][0]*a[2][3])+a[1][3]*(a[2][0]*a[3][1]-a[2][1]*a[3][0]))
      -a[0][3]*(a[1][0]*(a[2][1]*a[3][2]-a[3][1]*a[2][2])-a[1][1]*(a[2][0]*a[3][2]-a[3][0]*a[2][2])+a[1][2]*(a[2][0]*a[3][1]-a[3][0]*a[2][1]));

      В общем: полное беспросветное говно, не имеющее никаких оправданий.
      Ответить
    • а вот мне нужен детерминант матрицы 3х3 и 10х10. неуниверсально - печалько...
      Ответить
    • сделайте меня развидеть это
      Ответить
    • google> site:otvet.mail.ru 1_and_0
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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