1. Pascal / Говнокод #11342

    +94

    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
    function Dist(dx, dy: integer): integer;  
    begin
      //result := trunc(sqrt(sqr(dx)+sqr(dy)));
      dx := abs(dx);
      dy := abs(dy);
      if dx>dy then begin
        dy := dy shr 1 - dx shr 3;
        if dy >= 0 then result := dx+dy else result := dx;
      end else begin
        dx := dx shr 1 - dy shr 3;
        if dx >= 0 then result := dx+dy else result := dy;
      end;
    end;

    Ещё по теме приближённых расчётов в игровом движке.

    Запостил: TarasB, 02 Июля 2012

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

    • И намного это быстрее?
      Ответить
      • Сам-то как думаешь?
        Есть ещё кармаков fastDist, погуглите сами. Он чуть быстрее этого, но по точности нааамного хуже.
        Ответить
        • А на каком принципе работает?
          Ответить
          • У Кармака вроде так:
            if (dx>dy) return dx+dy/2; else return dy+dx/2;
            Ответить
        • что-то мне тоже не совсем понятно, почему
          http://tinyurl.com/cpe6ze5
          Ответить
          • Используй геометрию, а не алгебру.
            Ответить
            • без алгебры не подберёшь оптимальные коэффиценты
              Ответить
              • Чтобы понять формулу, используй геометрию.
                Можешь даже вывести на экран множество точек, для которых функция даст меньше 1000.
                Ответить
                • На моем AMD FSQRT занимает всего 6 тактов. Какие проблемы? Уж лучше я (x**2+y**2)**0.5 посчитаю, чем буду писать эту тормозную неточную галиматью, что написана во главе говнокода.
                  Ответить
                  • Тссс... у тараса старый целерон
                    Ответить
                  • > На моем
                    > Уж лучше я
                    Ответить
                  • При написании софта не для себя следует ориентироваться не на свой AMD, а на машины, которые будут стоять у ЦА...
                    Ответить
                    • Ну у него уж точно не будет машин 300хсот летней давности. А смысла ориентироваться на прочих нищебродов нет.
                      Ответить
                      • А на мобилах тоже квадратный корень делается за 6 тактов?
                        Ответить
                        • да, только 1 такт = 1 секунда
                          Ответить
                          • То есть 15 (или сколько, не считал) тактов моего кода будут выполняться 15 секунд?
                            Ответить
                            • во всем есть свои плюсы не кресты:

                              запустил код, пошел пить кофе\чай, пришел - ура, выполнилось!
                              Ответить
                  • праздный вопрос - как мне посчитать именно через FSQRT в 6 тактов на i7?
                    а то сравнение cmath vs taras даже с /O2 /SSE2 в пользу последнего
                    да и по точности в среднем 1% от эталонного
                    Ответить
                    • Точность в худшем случае примерно на 3% расходится.
                      Вообще у ней внутре - почти правильный 12-угольник.
                      Ответить
    • Ещё вариант: http://www.flipcode.com/archives/Fast_Approximate_Distance_Functions.shtm l
      Но там в самом конце получается говно, которое хуже моего варианта по всем параметрам.
      Ответить
    • а что, компилятор дельфи не умеет из целочисленного деления на степени двойки сделать самостоятельно сдвиг?
      Ответить
      • Это не кулцхакерно
        Ответить
      • Умеет, но он генерирует лишнюю проверку знака.
        В исполнении компилятора будет как-то так:
        if (x>0) then y := x sar 3 else y := (x+7) sar 3;
        Чтобы например -4 div 8 давало 0, в соответствии с убогой интеллоарифметикой.
        Подробнее тут: http://www.gamedev.ru/code/forum/?id=138759
        Ответить
      • gcc из a/2 сделало вот такой код:
        mov	eax, edi
        shr	eax, 31
        add	eax, edi
        sar	eax

        Где в edi лежит значение a, а в eax получаем ответ.
        Для unsigned такой проблемы конечно же нет. И там сгенерится тупой сдвиг.
        Ответить
    • Разбанте тараса уже. Уже даже меня выпустили. А я ведь тот ещё дебашир.
      Ответить
      • >Уже даже меня выпустили.
        Не переживай, скоро опять в школу.
        "Снова в школу, снова в школу, снова в школу."
        Ответить

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