Школоло / Говнокод #11342 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 TarasB, (Updated )

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

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

                            запустил код, пошел пить кофе\чай, пришел - ура, выполнилось!
                            Ответить
                • праздный вопрос - как мне посчитать именно через FSQRT в 6 тактов на i7?
                  а то сравнение cmath vs taras даже с /O2 /SSE2 в пользу последнего
                  да и по точности в среднем 1% от эталонного
                  Ответить
                  • Точность в худшем случае примерно на 3% расходится.
                    Вообще у ней внутре - почти правильный 12-угольник.
                    Ответить
  • а что, компилятор дельфи не умеет из целочисленного деления на степени двойки сделать самостоятельно сдвиг?
    Ответить
    • Умеет, но он генерирует лишнюю проверку знака.
      В исполнении компилятора будет как-то так:
      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 такой проблемы конечно же нет. И там сгенерится тупой сдвиг.
      Ответить
  • Разбанте тараса уже. Уже даже меня выпустили. А я ведь тот ещё дебашир.
    Ответить
    • >Уже даже меня выпустили.
      Не переживай, скоро опять в школу.
      "Снова в школу, снова в школу, снова в школу."
      Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8