5 // Bob Smith (bob@thestuff.net)
6 // Dan Lewis (dihlewis@yahoo.co.uk)
8 // (C) 2001 Bob Smith. http://www.thestuff.net
12 using System.Globalization;
13 using System.Runtime.CompilerServices;
18 public sealed class Math
20 public const double E = 2.7182818284590452354;
21 public const double PI = 3.14159265358979323846;
22 public static decimal Abs(decimal value)
24 return (value < 0)? -value: value;
26 public static double Abs(double value)
28 return (value < 0)? -value: value;
30 public static float Abs(float value)
32 return (value < 0)? -value: value;
34 public static int Abs(int value)
36 if (value == Int32.MinValue)
37 throw new OverflowException (Locale.GetText (Locale.GetText ("Value is too small")));
38 return (value < 0)? -value: value;
40 public static long Abs(long value)
42 if (value == Int64.MinValue)
43 throw new OverflowException(Locale.GetText ("Value is too small"));
44 return (value < 0)? -value: value;
46 public static sbyte Abs(sbyte value)
48 if (value == SByte.MinValue)
49 throw new OverflowException(Locale.GetText ("Value is too small"));
50 return (sbyte)((value < 0)? -value: value);
52 public static short Abs(short value)
54 if (value == Int16.MinValue)
55 throw new OverflowException(Locale.GetText ("Value is too small"));
56 return (short)((value < 0)? -value: value);
59 public static double Ceiling(double a)
61 double b = (double)((long)a);
62 return (b < a)? b+1: b;
64 public static double Floor(double d) {
65 return (double)((long)d) ;
67 public static double IEEERemainder(double x, double y)
70 if (y == 0) return Double.NaN;
71 r = x - (y * Math.Round(x/y));
73 return (x > 0)? 0: -0;
75 public static double Log(double a, double newBase)
77 if (a == 0) return Double.NegativeInfinity;
78 else if (a < 0) return Double.NaN;
79 return Log(a)/Log(newBase);
82 public static byte Max(byte val1, byte val2)
84 return (val1 > val2)? val1: val2;
86 public static decimal Max(decimal val1, decimal val2)
88 return (val1 > val2)? val1: val2;
90 public static double Max(double val1, double val2)
92 return (val1 > val2)? val1: val2;
94 public static float Max(float val1, float val2)
96 return (val1 > val2)? val1: val2;
98 public static int Max(int val1, int val2)
100 return (val1 > val2)? val1: val2;
102 public static long Max(long val1, long val2)
104 return (val1 > val2)? val1: val2;
106 public static sbyte Max(sbyte val1, sbyte val2)
108 return (val1 > val2)? val1: val2;
110 public static short Max(short val1, short val2)
112 return (val1 > val2)? val1: val2;
114 public static uint Max(uint val1, uint val2)
116 return (val1 > val2)? val1: val2;
118 public static ulong Max(ulong val1, ulong val2)
120 return (val1 > val2)? val1: val2;
122 public static ushort Max(ushort val1, ushort val2)
124 return (val1 > val2)? val1: val2;
126 public static byte Min(byte val1, byte val2)
128 return (val1 < val2)? val1: val2;
130 public static decimal Min(decimal val1, decimal val2)
132 return (val1 < val2)? val1: val2;
134 public static double Min(double val1, double val2)
136 return (val1 < val2)? val1: val2;
138 public static float Min(float val1, float val2)
140 return (val1 < val2)? val1: val2;
142 public static int Min(int val1, int val2)
144 return (val1 < val2)? val1: val2;
146 public static long Min(long val1, long val2)
148 return (val1 < val2)? val1: val2;
150 public static sbyte Min(sbyte val1, sbyte val2)
152 return (val1 < val2)? val1: val2;
154 public static short Min(short val1, short val2)
156 return (val1 < val2)? val1: val2;
158 public static uint Min(uint val1, uint val2)
160 return (val1 < val2)? val1: val2;
162 public static ulong Min(ulong val1, ulong val2)
164 return (val1 < val2)? val1: val2;
166 public static ushort Min(ushort val1, ushort val2)
168 return (val1 < val2)? val1: val2;
171 public static decimal Round(decimal d)
173 decimal r = (decimal)((long)d);
175 if (a > .5M) return ++r;
176 else if (a <.5M) return r;
179 if (r%2 == 0) return r;
183 public static decimal Round(decimal d, int decimals)
188 if (decimals < 0 || decimals > 15)
189 throw new ArgumentOutOfRangeException(Locale.GetText (
190 "Value is too small or too big."));
191 else if (decimals == 0)
192 return Math.Round(d);
193 for (c=0; c<decimals; c++) p*=10;
195 retval=Math.Round(retval);
199 public static double Round(double d)
201 double r = (double)((long)d);
203 if (a > .5) return ++r;
204 else if (a <.5) return r;
207 if (r%2 == 0) return r;
211 public static double Round(double value, int digits) {
214 double retval = value;
215 if (digits < 0 || digits > 15)
216 throw new ArgumentOutOfRangeException(Locale.GetText (
217 "Value is too small or too big."));
218 else if (digits == 0)
219 return Math.Round(value);
220 for (c=0; c<digits; c++) p*=10;
222 retval=Math.Round(retval);
226 public static int Sign(decimal value)
228 if (value > 0) return 1;
229 return (value == 0)? 0: -1;
231 public static int Sign(double value)
233 if (value > 0) return 1;
234 return (value == 0)? 0: -1;
236 public static int Sign(float value)
238 if (value > 0) return 1;
239 return (value == 0)? 0: -1;
241 public static int Sign(int value)
243 if (value > 0) return 1;
244 return (value == 0)? 0: -1;
246 public static int Sign(long value)
248 if (value > 0) return 1;
249 return (value == 0)? 0: -1;
251 public static int Sign(sbyte value)
253 if (value > 0) return 1;
254 return (value == 0)? 0: -1;
256 public static int Sign(short value)
258 if (value > 0) return 1;
259 return (value == 0)? 0: -1;
264 [MethodImplAttribute (MethodImplOptions.InternalCall)]
265 public extern static double Sin (double x);
267 [MethodImplAttribute (MethodImplOptions.InternalCall)]
268 public extern static double Cos (double x);
270 [MethodImplAttribute (MethodImplOptions.InternalCall)]
271 public extern static double Tan (double x);
273 [MethodImplAttribute (MethodImplOptions.InternalCall)]
274 public extern static double Sinh (double x);
276 [MethodImplAttribute (MethodImplOptions.InternalCall)]
277 public extern static double Cosh (double x);
279 [MethodImplAttribute (MethodImplOptions.InternalCall)]
280 public extern static double Tanh (double x);
282 [MethodImplAttribute (MethodImplOptions.InternalCall)]
283 public extern static double Acos (double x);
285 [MethodImplAttribute (MethodImplOptions.InternalCall)]
286 public extern static double Asin (double x);
288 [MethodImplAttribute (MethodImplOptions.InternalCall)]
289 public extern static double Atan (double x);
291 [MethodImplAttribute (MethodImplOptions.InternalCall)]
292 public extern static double Atan2 (double y, double x);
294 [MethodImplAttribute (MethodImplOptions.InternalCall)]
295 public extern static double Exp (double x);
297 [MethodImplAttribute (MethodImplOptions.InternalCall)]
298 public extern static double Log (double x);
300 [MethodImplAttribute (MethodImplOptions.InternalCall)]
301 public extern static double Log10 (double x);
303 [MethodImplAttribute (MethodImplOptions.InternalCall)]
304 public extern static double Pow (double x, double y);
306 [MethodImplAttribute (MethodImplOptions.InternalCall)]
307 public extern static double Sqrt (double x);