Форум: "Прочее";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
ВнизFastRound(). Жуть какая :) Найти похожие ветки
← →
DevilDevil © (2007-03-12 10:54) [0]
const RNDconst : double = 6755399441055744.0;
function FastRound(X : double) : integer;
asm
fld qword ptr [esp+8]
fadd RNDconst
fstp qword ptr [esp+8]
mov eax, [esp+8]
end;
По идее, надо бы сначала в TASMе откомпилировать, чтобы от лишних команд избавиться.
← →
Сергей М. © (2007-03-12 10:58) [1]Где ты эту жуть узрел ?
И где здесь "лишние команды" ?
← →
DevilDevil © (2007-03-12 11:00) [2]1) просто слишком необычный способ
2) в дебагере
← →
DevilDevil © (2007-03-12 11:03) [3]А вообще нашёл здесь:
http://www.gamedev.ru/tip/?id=134
Сначала не верил, решил проверить. Работает блин! :)
на асм перевёл сам.
P.S. Round() в Delphi намного больше делает.
← →
REA (2007-03-12 11:06) [4]Больше или дольше?
← →
DevilDevil © (2007-03-12 11:11) [5]> REA (12.03.07 11:06) [4]
Больше операций выполняются Дольше.
← →
Сергей М. © (2007-03-12 11:23) [6]
> Round() в Delphi намного больше делает
Вот его код:procedure _ROUND;
asm
SUB ESP,8
FISTP qword ptr [ESP]
FWAIT
POP EAX
POP EDX
end;
И что здесь есть, по-твоему, "намного больше" ?
← →
DevilDevil © (2007-03-12 11:43) [7]> Сергей М. © (12.03.07 11:23) [6]
Вот опозорился... с Trunc() перепутал... :)
← →
DevilDevil © (2007-03-17 00:09) [8]> Сергей М. © (12.03.07 11:23) [6]
Ну хорошо, получайте!const FloatConsts : array[boolean] of single = (-0.5, +0.5);
function FastTrunc(X : single) : integer;
asm
mov eax, X
shr eax, 31
fld dword ptr [FloatConsts + eax*4]
fadd X
fistp X
mov eax, X
end;
а на Delphi это выглядит примерно так:function FastTruncDelphi(X : single) : integer;
begin
Result := Round(X + FloatConsts[pinteger(@X)^<0]);
end;
← →
ПЧЁЛ (2007-03-17 00:14) [9]DevilDevil © (17.03.07 0:09) [8]
Падаем ниц..
← →
DevilDevil © (2007-03-17 13:10) [10]> ПЧЁЛ (17.03.07 00:14) [9]
> Падаем ниц..
Гы. Это я сам придумал! :)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.043 c