home *** CD-ROM | disk | FTP | other *** search
-
- package REFUNCT is
-
- -- stripped down real functions package
- -- this should work on any compiler on any computer
-
- function EXP10 ( X : FLOAT ) return FLOAT ;
-
- function "**" ( X , Y : FLOAT ) return FLOAT ;
-
- function LOG10 ( X : FLOAT ) return FLOAT ;
-
- function SQRT ( X : FLOAT ) return FLOAT ;
-
- end REFUNCT ;
-
- package body REFUNCT is
-
- function EXP10 ( X : FLOAT ) return FLOAT is
- C1 : constant FLOAT := 1.15129277603 ;
- C2 : constant FLOAT := 0.66273088429 ;
- C3 : constant FLOAT := 0.25439357484 ;
- C4 : constant FLOAT := 0.07295173666 ;
- C5 : constant FLOAT := 0.01742111988 ;
- C6 : constant FLOAT := 0.00255491796 ;
- C7 : constant FLOAT := 0.00093264267 ;
- X1 : FLOAT ;
- Y : FLOAT ;
- TEN_PWR : FLOAT ;
- begin
- X1 := abs ( X ) ;
- TEN_PWR := 1.0 ;
- while X1 >= 1.0 loop
- TEN_PWR := TEN_PWR * 10.0 ;
- X1 := X1 - 1.0 ;
- end loop ;
- Y := 1.0 + ( C1 +( C2 +( C3 +( C4 +( C5 +( C6 + C7 * X1 ) * X1) * X1) * X1
- ) * X1) * X1) * X1 ;
- Y := Y * Y * TEN_PWR ;
- if X < 0.0 then
- Y := 1.0 / Y ;
- end if ;
- return Y ;
- end EXP10 ;
-
- function "**" ( X , Y : FLOAT ) return FLOAT is
- begin
- if X = 0.0 then
- return 0.0 ;
- elsif Y = 0.0 then
- return 1.0 ;
- else
- return EXP10 ( Y * LOG10( X )) ;
- end if ;
- end "**" ;
-
- function LOG10 ( X : FLOAT ) return FLOAT is
- C1 : constant FLOAT := 0.868591718 ;
- C3 : constant FLOAT := 0.289335524 ;
- C5 : constant FLOAT := 0.177522071 ;
- C7 : constant FLOAT := 0.094376476 ;
- C9 : constant FLOAT := 0.191337714 ;
- C_R10 : constant FLOAT := 3.1622777 ;
- Y : FLOAT ;
- X_NORM : FLOAT ;
- X_LOG : FLOAT ;
- FRAC : FLOAT ;
- FRAC_2 : FLOAT ;
- begin
- X_LOG := 0.5 ;
- X_NORM := X ;
- if X >= 10.0 then
- while X_NORM >= 10.0 -- REDUCE TO 1.0 .. 10.0
- loop
- X_LOG := X_LOG + 1.0 ;
- X_NORM := X_NORM * 0.1 ;
- end loop ;
- else
- while X_NORM < 1.0 -- REDUCE TO 1.0 .. 10.0
- loop
- X_LOG := X_LOG - 1.0 ;
- X_NORM := X_NORM * 10.0 ;
- end loop ;
- end if ;
- FRAC := ( X_NORM - C_R10 ) / ( X_NORM + C_R10 ) ;
- FRAC_2 := FRAC * FRAC ;
- Y := ( C1 +( C3 +( C5 +( C7 + C9 * FRAC_2 ) * FRAC_2) * FRAC_2) * FRAC_2)
- * FRAC ;
- return Y + X_LOG ;
- end LOG10 ;
-
- function SQRT ( X : FLOAT ) return FLOAT is
- Y , ROOT_PWR , X_NORM : FLOAT ;
- A : constant FLOAT := 2.1902 ;
- B : constant FLOAT := - 3.0339 ;
- C : constant FLOAT := 1.5451 ;
- begin
- X_NORM := X ;
- ROOT_PWR := 1.0 ;
- if X > 1.0 then -- REDUCE TO 0.25 .. 1.0
- while X_NORM > 1.0 loop
- ROOT_PWR := ROOT_PWR * 2.0 ;
- X_NORM := X_NORM * 0.25 ;
- end loop ;
- else
- while X_NORM < 0.25 loop
- ROOT_PWR := ROOT_PWR * 0.5 ;
- X_NORM := X_NORM * 4.0 ;
- end loop ;
- end if ;
- Y := A + B / ( C + X_NORM ) ;
- Y := 0.5 * ( Y + X_NORM / Y ) ;
- Y := 0.5 * ( Y + X_NORM / Y ) ;
- Y := Y * ROOT_PWR ;
- return Y ;
- end SQRT ;
-
- end REFUNCT ;
-