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

    +138

    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
    typedef int32_t wl_fixed_t;
    
    //было:
    static inline double wl_fixed_to_double(wl_fixed_t f)
    {
      return (double) f / 256.0;
    }
    
    //стало:
    static inline double wl_fixed_to_double(wl_fixed_t f)
    {
      union {
        double d;
        int64_t i;
      } u;
    
      u.i = ((1023LL + 44LL) << 52) + (1LL << 51) + f;
    
      return u.d - (3LL << 43);
    }

    Заоптимизировали...

    Запостил: rat4, 16 Мая 2012

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

    • Why so magic?
      Ответить
      • Мне больше интересно что курил автор.
        Ответить
        • Что-то тяжелое и опасное для здоровья окружающих.
          Ответить
          • Написал им в рассылку, они там все употребляют тяжёлые вещи...
            Ответить
      • 1LL << 51 - старший бит мантиссы выставляем в единичку
        +f - младшие биты мантиссы заполняем нашим числом
        (1023LL+44LL)<<52 - порядок равен 2^44

        Т.о. младшие 8 бит f попали в дробную часть, а старшие 44 в целую, но к ним прибавили 2^43 (та самая единичка сдвинутая на 51) и 2^44 - неявная единичка в виртуальном 53 бите мантиссы.

        Нижняя строчка как раз корректирует это, вычитая 2^43*3 = 2^43+2^44.

        P.S. мое описание для положительных чисел, для отрицательных пока не вкурил, но тем не менее код работает и для них.
        Ответить
    • Да кстати, код должен баговать начиная с 2^44. В отличие от первоначальной версии.
      Ответить
      • На большие числа там можно забить, и на отрицательные, наверное, тоже.

        UPD:
        >int32_t
        >2^44
        Что-то тут не так...
        Ответить
        • А, да, большое число туда и не залезет. Ступил.
          Ответить
    • Задроты :-)
      Ответить
    • http://phimuemue.com/blog.php?article=%20151
      Ответить
    • Вялендопроблемы.
      Ответить
      • Как там с X12 вопрос обстоит?
        Ответить
        • По сути, Wayland - это и есть X12. Пилится он разработчиками иксов с пониманием тех граблей, на которые наступили X11 за многолетнюю свою историю.

          И я, если что, только за Wayland. Вот только непонятно, как там с блобами жить.
          Ответить
    • и стало быстрее? и на сколько?
      Ответить
      • My results on Intel(R) Core(TM)2 Duo CPU T5800 @ 2.00GHz

        on x86:
        benchmarked magic: 14.048889885s
        benchmarked mul: 4.034106976s

        on x86-64:
        benchmarked magic: 2.467789582s
        benchmarked mul: 8.665307997s
        Ответить
        • Т.е. на x86-64 быстрее, а на х86 хуже? Ну хотя да, логично, там же int64 используется.
          Ответить
    • http://stackoverflow.com/questions/10635656/convert-from-binary-to-floating-point
      Ответить

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