function sgn (a : real) : real; begin
if a < 0 then sgn := -1;
else sgn := 1;
end;
function atan2 (y, x : real) : real; begin
if x > 0 then atan2 := arctan (y/x)
else if x > 0 then atan2 := arctan (y/x) + pi
else atan2 := pi/2 * sgn (y);
end;
{
Я сделал это некоторое время назад при портировании кода из FORTRAN на Pascal.
К сожалению, это было так давно, что я не помню, тестировал я это,
или нет.
}
От: Terje Mathisen <Terje.Mathisen@hda.hydro.com> Тема: На: Как продублировать C функцию ATAN2 в Delphi? Дата: 18 Мая 1995 19:25:10 GMT
Я думаю вы должны для этого обратить пристальное внимание на инструкцию FPATAN!
Это x87 opcode реализация IEEE-compliant функции ATAN2(), с полной расширенной точностью, и поддержкой аппаратных реализаций низкоуровневых функций.
Если вы активизировали "числовые" исключения, и контроль за неверными входными числами, чип x87 выдаст верное значение без необходимости опережающего тестирования параметров.
p
BP/TP/Delphi-совместимая версия должна выглядеть примерно так:
Function atan2(y : extended; x : extended): Extended; Assembler; asm
fld [y]
fld [x]
fpatan
end;
Общее время выполнение - менее 200 чиклов на Pentium, с вероятностью возникновения ошибки - максимально не более одной, если, конечно, у вас не Pentium с ошибкой FDIV, где ее вероятность появляется после первых 15-20 верных битов! :-)
Библиотечная функция ArcTan(x) реализуется как fpatan(1.0,x), если вы компилируете ее с реальной установкой IEEE {$N+}.
Terje
--
-Terje Mathisen (включая стандартное предупреждение) <Terje.Mathisen@hda.hydro.com>
"почти все программирование может быть рассмотрено как упражнение в кэшировании"