[BACK]Return to multprec_mathematical_functions.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Numbers

File: [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Numbers / multprec_mathematical_functions.adb (download)

Revision 1.1.1.1 (vendor branch), Sun Oct 29 17:45:26 2000 UTC (23 years, 7 months ago) by maekawa
Branch: PHC, MAIN
CVS Tags: v2, maekawa-ipv6, RELEASE_1_2_3, RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX, RELEASE_1_2_2, RELEASE_1_2_1, HEAD
Changes since 1.1: +0 -0 lines

Import the second public release of PHCpack.

OKed by Jan Verschelde.

with text_io;                            use text_io;
with Multprec_Floating_Numbers_io;       use Multprec_Floating_Numbers_io;

with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
with Standard_Mathematical_Functions;    use Standard_Mathematical_Functions;

package body Multprec_Mathematical_Functions is

-- EXPONENTIAL AND LOGARITHMIC FUNCTIONS :

  function "**" ( x,y : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);
    sy : double_float := Round(y);

  begin
    sx := sx**sy;
    res := Create(sx);
    return res;
  end "**";

  function LOG2 ( x : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);

  begin
    sx := LOG2(sx);
    res := Create(sx);
    return res;
  end LOG2;

  function LOG10 ( x : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);

  begin
    sx := LOG10(sx);
    res := Create(sx);
    return res;
  end LOG10;

  function SQRT ( x : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);
    sizex : natural := Size_Fraction(x);
    sizeres : natural;

    procedure Iterate ( a : in Floating_Number ) is

      oneres,twores : Floating_Number;

    begin
      for i in 1..3 loop
        Copy(res,oneres);      put("init   : "); put(oneres); new_line;
        twores := 2.0*oneres;  put("2*init : "); put(twores); new_line;
        Mul(res,res);
        Sub(res,a);       put("residual : "); put(res); new_line;
        Div(res,twores);  put("inc : "); put(res); new_line;
        twores := oneres - res;
        Copy(twores,res);
        Clear(twores); Clear(oneres);
      end loop;
    end Iterate;

  begin
    sx := SQRT(sx);
    res := Create(sx); 
    sizeres := Size_Fraction(res);
    if (sx /= 0.0) and (sizeres < sizex)
     then Expand(res,sizex-sizeres);
          if sx >= 1.0
           then Iterate(x);
           else declare
                  invx : Floating_Number := 1.0/x;
                  invres : Floating_Number := 1.0/res;
                begin
                  Copy(invres,res);  Clear(invres);
                  Iterate(invx);
                  invres := 1.0/res;
                  Copy(invres,res);  Clear(invres);
                end;
          end if;
    end if;
    return res;
  end SQRT;

-- TRIGONOMETRIC FUNCTIONS :

  function SIN ( x : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);

  begin
    sx := SIN(sx);
    res := Create(sx);
    return res;
  end SIN;

  function COS ( x : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);

  begin
    sx := COS(sx);
    res := Create(sx);
    return res;
  end COS;

  function TAN ( x : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);

  begin
    sx := TAN(sx);
    res := Create(sx);
    return res;
  end TAN;

  function ARCSIN ( x : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);

  begin
    sx := ARCSIN(sx);
    res := Create(sx);
    return res;
  end ARCSIN;

  function ARCCOS ( x : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);

  begin
    sx := ARCCOS(sx);
    res := Create(sx);
    return res;
  end ARCCOS;

  function ARCTAN ( x : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);

  begin
    sx := ARCTAN(sx);
    res := Create(sx);
    return res;
  end ARCTAN;

  function Radius ( x,y : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);
    sy : double_float := Round(y);

  begin
    sx := Radius(sx,sy);
    res := Create(sx);
    return res;
  end Radius;

  function Angle  ( x,y : Floating_Number ) return Floating_Number is

    res : Floating_Number;
    sx : double_float := Round(x);
    sy : double_float := Round(y);

  begin
    sx := Angle(sx,sy);
    res := Create(sx);
    return res;
  end Angle;

end Multprec_Mathematical_Functions;