Цитата:
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;