Я сделал это некоторое время
|
|
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.
К сожалению, это было так давно, что я не помню, тестировал я это,
или нет.
}
|
Nathan
-------------------------------------------------------------------------------
От: 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>
"почти все программирование может быть рассмотрено как упражнение в кэшировании"
-------------------------------------------------------------------------------
Это может содержать потенциальную проблему: win87em.dll и библиотека sw не будет работать на машинах, не оснащенных CoP.
--
Name: Dr Jon Jenkins
Интернет: jenkinsj@ozy.dec.com
[001972]
Содержание раздела