- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 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;
Есть ещё кармаков fastDist, погуглите сами. Он чуть быстрее этого, но по точности нааамного хуже.
if (dx>dy) return dx+dy/2; else return dy+dx/2;
Можешь даже вывести на экран множество точек, для которых функция даст меньше 1000.
> Уж лучше я
запустил код, пошел пить кофе\чай, пришел - ура, выполнилось!
а то сравнение cmath vs taras даже с /O2 /SSE2 в пользу последнего
да и по точности в среднем 1% от эталонного
Вообще у ней внутре - почти правильный 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
Где в edi лежит значение a, а в eax получаем ответ.
Для unsigned такой проблемы конечно же нет. И там сгенерится тупой сдвиг.
Не переживай, скоро опять в школу.
"Снова в школу, снова в школу, снова в школу."