Советы по Delphi

         

Я сделал это некоторое время


    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]


Содержание раздела