Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Numbers/multprec_mathematical_functions.adb, Revision 1.1
1.1 ! maekawa 1: with text_io; use text_io;
! 2: with Multprec_Floating_Numbers_io; use Multprec_Floating_Numbers_io;
! 3:
! 4: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
! 5: with Standard_Mathematical_Functions; use Standard_Mathematical_Functions;
! 6:
! 7: package body Multprec_Mathematical_Functions is
! 8:
! 9: -- EXPONENTIAL AND LOGARITHMIC FUNCTIONS :
! 10:
! 11: function "**" ( x,y : Floating_Number ) return Floating_Number is
! 12:
! 13: res : Floating_Number;
! 14: sx : double_float := Round(x);
! 15: sy : double_float := Round(y);
! 16:
! 17: begin
! 18: sx := sx**sy;
! 19: res := Create(sx);
! 20: return res;
! 21: end "**";
! 22:
! 23: function LOG2 ( x : Floating_Number ) return Floating_Number is
! 24:
! 25: res : Floating_Number;
! 26: sx : double_float := Round(x);
! 27:
! 28: begin
! 29: sx := LOG2(sx);
! 30: res := Create(sx);
! 31: return res;
! 32: end LOG2;
! 33:
! 34: function LOG10 ( x : Floating_Number ) return Floating_Number is
! 35:
! 36: res : Floating_Number;
! 37: sx : double_float := Round(x);
! 38:
! 39: begin
! 40: sx := LOG10(sx);
! 41: res := Create(sx);
! 42: return res;
! 43: end LOG10;
! 44:
! 45: function SQRT ( x : Floating_Number ) return Floating_Number is
! 46:
! 47: res : Floating_Number;
! 48: sx : double_float := Round(x);
! 49: sizex : natural := Size_Fraction(x);
! 50: sizeres : natural;
! 51:
! 52: procedure Iterate ( a : in Floating_Number ) is
! 53:
! 54: oneres,twores : Floating_Number;
! 55:
! 56: begin
! 57: for i in 1..3 loop
! 58: Copy(res,oneres); put("init : "); put(oneres); new_line;
! 59: twores := 2.0*oneres; put("2*init : "); put(twores); new_line;
! 60: Mul(res,res);
! 61: Sub(res,a); put("residual : "); put(res); new_line;
! 62: Div(res,twores); put("inc : "); put(res); new_line;
! 63: twores := oneres - res;
! 64: Copy(twores,res);
! 65: Clear(twores); Clear(oneres);
! 66: end loop;
! 67: end Iterate;
! 68:
! 69: begin
! 70: sx := SQRT(sx);
! 71: res := Create(sx);
! 72: sizeres := Size_Fraction(res);
! 73: if (sx /= 0.0) and (sizeres < sizex)
! 74: then Expand(res,sizex-sizeres);
! 75: if sx >= 1.0
! 76: then Iterate(x);
! 77: else declare
! 78: invx : Floating_Number := 1.0/x;
! 79: invres : Floating_Number := 1.0/res;
! 80: begin
! 81: Copy(invres,res); Clear(invres);
! 82: Iterate(invx);
! 83: invres := 1.0/res;
! 84: Copy(invres,res); Clear(invres);
! 85: end;
! 86: end if;
! 87: end if;
! 88: return res;
! 89: end SQRT;
! 90:
! 91: -- TRIGONOMETRIC FUNCTIONS :
! 92:
! 93: function SIN ( x : Floating_Number ) return Floating_Number is
! 94:
! 95: res : Floating_Number;
! 96: sx : double_float := Round(x);
! 97:
! 98: begin
! 99: sx := SIN(sx);
! 100: res := Create(sx);
! 101: return res;
! 102: end SIN;
! 103:
! 104: function COS ( x : Floating_Number ) return Floating_Number is
! 105:
! 106: res : Floating_Number;
! 107: sx : double_float := Round(x);
! 108:
! 109: begin
! 110: sx := COS(sx);
! 111: res := Create(sx);
! 112: return res;
! 113: end COS;
! 114:
! 115: function TAN ( x : Floating_Number ) return Floating_Number is
! 116:
! 117: res : Floating_Number;
! 118: sx : double_float := Round(x);
! 119:
! 120: begin
! 121: sx := TAN(sx);
! 122: res := Create(sx);
! 123: return res;
! 124: end TAN;
! 125:
! 126: function ARCSIN ( x : Floating_Number ) return Floating_Number is
! 127:
! 128: res : Floating_Number;
! 129: sx : double_float := Round(x);
! 130:
! 131: begin
! 132: sx := ARCSIN(sx);
! 133: res := Create(sx);
! 134: return res;
! 135: end ARCSIN;
! 136:
! 137: function ARCCOS ( x : Floating_Number ) return Floating_Number is
! 138:
! 139: res : Floating_Number;
! 140: sx : double_float := Round(x);
! 141:
! 142: begin
! 143: sx := ARCCOS(sx);
! 144: res := Create(sx);
! 145: return res;
! 146: end ARCCOS;
! 147:
! 148: function ARCTAN ( x : Floating_Number ) return Floating_Number is
! 149:
! 150: res : Floating_Number;
! 151: sx : double_float := Round(x);
! 152:
! 153: begin
! 154: sx := ARCTAN(sx);
! 155: res := Create(sx);
! 156: return res;
! 157: end ARCTAN;
! 158:
! 159: function Radius ( x,y : Floating_Number ) return Floating_Number is
! 160:
! 161: res : Floating_Number;
! 162: sx : double_float := Round(x);
! 163: sy : double_float := Round(y);
! 164:
! 165: begin
! 166: sx := Radius(sx,sy);
! 167: res := Create(sx);
! 168: return res;
! 169: end Radius;
! 170:
! 171: function Angle ( x,y : Floating_Number ) return Floating_Number is
! 172:
! 173: res : Floating_Number;
! 174: sx : double_float := Round(x);
! 175: sy : double_float := Round(y);
! 176:
! 177: begin
! 178: sx := Angle(sx,sy);
! 179: res := Create(sx);
! 180: return res;
! 181: end Angle;
! 182:
! 183: end Multprec_Mathematical_Functions;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>