5 // Bob Smith (bob@thestuff.net)
7 // (C) 2001 Bob Smith. http://www.thestuff.net
11 using System.Runtime.InteropServices;
15 public sealed class Math
17 public const double E = 2.7182818284590452354;
18 public const double PI = 3.14159265358979323846;
19 public static decimal Abs(decimal value)
21 return (value < 0)? -value: value;
23 public static double Abs(double value)
25 return (value < 0)? -value: value;
27 public static float Abs(float value)
29 return (value < 0)? -value: value;
31 public static int Abs(int value)
33 if (value == Int32.MinValue)
34 throw new OverflowException("Value is too small.");
35 return (value < 0)? -value: value;
37 public static long Abs(long value)
39 if (value == Int64.MinValue)
40 throw new OverflowException("Value is too small.");
41 return (value < 0)? -value: value;
43 public static sbyte Abs(sbyte value)
45 if (value == SByte.MinValue)
46 throw new OverflowException("Value is too small.");
47 return (sbyte)((value < 0)? -value: value);
49 public static short Abs(short value)
51 if (value == Int16.MinValue)
52 throw new OverflowException("Value is too small.");
53 return (short)((value < 0)? -value: value);
55 [ DllImport("libc", EntryPoint="acos") ]
56 private extern static double _Acos(double d);
57 public static double Acos(double d)
59 if (d < -1 || d > 1) return Double.NaN;
62 [ DllImport("libc", EntryPoint="asin") ]
63 private extern static double _Asin(double d);
64 public static double Asin(double d)
66 if (d < -1 || d > 1) return Double.NaN;
69 [ DllImport("libc", EntryPoint="atan") ]
70 public extern static double Atan(double d);
71 [ DllImport("libc", EntryPoint="atan2") ]
72 public extern static double Atan2(double y, double x);
73 public static double Ceiling(double a)
75 double b = (double)((long)a);
76 return (b < a)? b+1: b;
78 [ DllImport("libc", EntryPoint="cos") ]
79 public extern static double Cos(double d);
80 [ DllImport("libc", EntryPoint="cosh") ]
81 public extern static double Cosh(double value);
82 [ DllImport("libc", EntryPoint="exp") ]
83 public extern static double Exp(double d);
84 public static double Floor(double d) {
85 return (double)((long)d) ;
87 public static double IEEERemainder(double x, double y)
90 if (y == 0) return Double.NaN;
91 r = x - (y * Math.Round(x/y));
93 return (x > 0)? 0: -0;
95 [ DllImport("libc", EntryPoint="log") ]
96 private extern static double _Log(double d);
97 public static double Log(double d)
99 if (d == 0) return Double.NegativeInfinity;
100 else if (d < 0) return Double.NaN;
103 public static double Log(double a, double newBase)
105 if (a == 0) return Double.NegativeInfinity;
106 else if (a < 0) return Double.NaN;
107 return Math._Log(a)/Math._Log(newBase);
109 [ DllImport("libc", EntryPoint="log10") ]
110 private extern static double _Log10(double d);
111 public static double Log10(double d)
113 if (d == 0) return Double.NegativeInfinity;
114 else if (d < 0) return Double.NaN;
115 return Math._Log10(d);
117 public static byte Max(byte val1, byte val2)
119 return (val1 > val2)? val1: val2;
121 public static decimal Max(decimal val1, decimal val2)
123 return (val1 > val2)? val1: val2;
125 public static double Max(double val1, double val2)
127 return (val1 > val2)? val1: val2;
129 public static float Max(float val1, float val2)
131 return (val1 > val2)? val1: val2;
133 public static int Max(int val1, int val2)
135 return (val1 > val2)? val1: val2;
137 public static long Max(long val1, long val2)
139 return (val1 > val2)? val1: val2;
141 public static sbyte Max(sbyte val1, sbyte val2)
143 return (val1 > val2)? val1: val2;
145 public static short Max(short val1, short val2)
147 return (val1 > val2)? val1: val2;
149 public static uint Max(uint val1, uint val2)
151 return (val1 > val2)? val1: val2;
153 public static ulong Max(ulong val1, ulong val2)
155 return (val1 > val2)? val1: val2;
157 public static ushort Max(ushort val1, ushort val2)
159 return (val1 > val2)? val1: val2;
161 public static byte Min(byte val1, byte val2)
163 return (val1 < val2)? val1: val2;
165 public static decimal Min(decimal val1, decimal val2)
167 return (val1 < val2)? val1: val2;
169 public static double Min(double val1, double val2)
171 return (val1 < val2)? val1: val2;
173 public static float Min(float val1, float val2)
175 return (val1 < val2)? val1: val2;
177 public static int Min(int val1, int val2)
179 return (val1 < val2)? val1: val2;
181 public static long Min(long val1, long val2)
183 return (val1 < val2)? val1: val2;
185 public static sbyte Min(sbyte val1, sbyte val2)
187 return (val1 < val2)? val1: val2;
189 public static short Min(short val1, short val2)
191 return (val1 < val2)? val1: val2;
193 public static uint Min(uint val1, uint val2)
195 return (val1 < val2)? val1: val2;
197 public static ulong Min(ulong val1, ulong val2)
199 return (val1 < val2)? val1: val2;
201 public static ushort Min(ushort val1, ushort val2)
203 return (val1 < val2)? val1: val2;
205 [ DllImport("libc", EntryPoint="pow") ]
206 public extern static double Pow(double x, double y);
207 public static decimal Round(decimal d)
209 decimal r = (decimal)((long)d);
211 if (a > .5M) return ++r;
212 else if (a <.5M) return r;
215 if (r%2 == 0) return r;
219 public static decimal Round(decimal d, int decimals)
224 if (decimals < 0 || decimals > 15)
225 throw new ArgumentOutOfRangeException("Value is too small or too big.");
226 else if (decimals == 0)
227 return Math.Round(d);
228 for (c=0; c<decimals; c++) p*=10;
230 retval=Math.Round(retval);
234 public static double Round(double d)
236 double r = (double)((long)d);
238 if (a > .5) return ++r;
239 else if (a <.5) return r;
242 if (r%2 == 0) return r;
246 public static double Round(double value, int digits) {
249 double retval = value;
250 if (digits < 0 || digits > 15)
251 throw new ArgumentOutOfRangeException("Value is too small or too big.");
252 else if (digits == 0)
253 return Math.Round(value);
254 for (c=0; c<digits; c++) p*=10;
256 retval=Math.Round(retval);
260 public static int Sign(decimal value)
262 if (value > 0) return 1;
263 return (value == 0)? 0: -1;
265 public static int Sign(double value)
267 if (value > 0) return 1;
268 return (value == 0)? 0: -1;
270 public static int Sign(float value)
272 if (value > 0) return 1;
273 return (value == 0)? 0: -1;
275 public static int Sign(int value)
277 if (value > 0) return 1;
278 return (value == 0)? 0: -1;
280 public static int Sign(long value)
282 if (value > 0) return 1;
283 return (value == 0)? 0: -1;
285 public static int Sign(sbyte value)
287 if (value > 0) return 1;
288 return (value == 0)? 0: -1;
290 public static int Sign(short value)
292 if (value > 0) return 1;
293 return (value == 0)? 0: -1;
295 [ DllImport("libc", EntryPoint="sin") ]
296 public extern static double Sin(double a);
297 [ DllImport("libc", EntryPoint="sinh") ]
298 public extern static double Sinh(double value);
299 [ DllImport("libc", EntryPoint="sqrt") ]
300 private extern static double _Sqrt(double d);
301 public static double Sqrt(double d)
303 if (d < 0) return Double.NaN;
304 return Math._Sqrt(d);
306 [ DllImport("libc", EntryPoint="tan") ]
307 public extern static double Tan(double a);
308 [ DllImport("libc", EntryPoint="tanh") ]
309 public extern static double Tanh(double value);