|
|
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 |