Цитата:
53 значащие цифры для гидромеханика-практика? Вы, скорее всего, неправильно поняли запись , то есть автору скорее всего надо 10 - 12 значащих цифр.
Вы правы, нужны 10-12 значащих цифр)
Цитата:
Покажите, как вы это проверяли. Я довольно хорошо знаком с frepascal и Lazarus, и у меня есть подозрение, что хромает ваша методика проверки быстродействия, а не функция exp.
Профайлера под Lazarus (Win) не нашел, поэтому проверял кустарно через :
procedure log_on(t:integer); {входная процедура счетчика продолжительности выполнения участков кода}
begin
tt2[t] := GetTickCount;
end;
procedure log_off(t:integer);{выходная процедура счетчика продолжительности выполнения участков кода}
begin
tt[t] := tt[t] + GetTickCount - tt2[t];
end;
и по участкам кода расставив типа:
log_on(N);
log_off(N);
А также общее время выполнения программы через тот же GetTickCount;
Больше всего времени среди всех вычислений тратится на power(x) (заменил на intpower(x) где можно) и на exp (x).
-- 27.02.2014, 20:46 --Пока нагуглил такое решение - быстрее стандартной Lazarus-ской exp(x), но точность в районе 2-го знака после запятой относительно оригинальной exp(x):
Код:
_fexpA:single=$800000/ln2; // $800000 = mantissa range
_fexpF=ln2*ln2/2;
_fexpB=$400000;
_fexpE:single=_fexpF/_fexpB;
_fexpD:single=1-_fexpF*_fexpF;
function fast_exp(const x:double):double;
var y:double;
begin
{$ASMMODE intel}
asm
fld dword ptr [x]
fld _fexpA
fmul
fistp dword ptr [x]
mov eax,dword ptr [x]
add eax,$3F800000
mov dword ptr [x],eax
fld dword ptr [x]
and eax, 2*_fexpB-1 // get the remainder
sub eax, _fexpB // make middle =0
mov dword ptr [x],eax
fild dword ptr [x] // load remainder
fld _fexpE
fmul // factor=(r*fexpE)^2 + fexpD
fmul st(0),st(0)
fld _fexpD
fadd
fmul // multiply by initial solution
fstp y
end;
fast_exp:=y;
end;