5 // Bob Smith (bob@thestuff.net)
6 // Dan Lewis (dihlewis@yahoo.co.uk)
7 // Pedro Martínez Juliá (yoros@wanadoo.es)
8 // Andreas Nahr (ClassDevelopment@A-SoftTech.com)
10 // (C) 2001 Bob Smith. http://www.thestuff.net
11 // Copyright (C) 2003 Pedro Martínez Juliá <yoros@wanadoo.es>
12 // Copyright (C) 2004 Novell (http://www.novell.com)
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Runtime.CompilerServices;
37 using System.Runtime.ConstrainedExecution;
42 public sealed class Math
44 public const double E = 2.7182818284590452354;
45 public const double PI = 3.14159265358979323846;
51 public static decimal Abs (decimal value)
53 return (value < 0)? -value: value;
56 public static double Abs (double value)
58 return (value < 0)? -value: value;
61 public static float Abs (float value)
63 return (value < 0)? -value: value;
66 public static int Abs (int value)
68 if (value == Int32.MinValue)
69 throw new OverflowException (Locale.GetText ("Value is too small."));
70 return (value < 0)? -value: value;
73 public static long Abs (long value)
75 if (value == Int64.MinValue)
76 throw new OverflowException (Locale.GetText ("Value is too small."));
77 return (value < 0)? -value: value;
80 [CLSCompliant (false)]
81 public static sbyte Abs (sbyte value)
83 if (value == SByte.MinValue)
84 throw new OverflowException (Locale.GetText ("Value is too small."));
85 return (sbyte)((value < 0)? -value: value);
88 public static short Abs (short value)
90 if (value == Int16.MinValue)
91 throw new OverflowException (Locale.GetText ("Value is too small."));
92 return (short)((value < 0)? -value: value);
95 public static double Ceiling (double a)
97 double result = Floor(a);
104 // The following methods are defined in ECMA specs but they are
105 // not implemented in MS.NET. However, they are in MS.NET 1.1
108 public static long BigMul (int a, int b)
110 return ((long)a * (long)b);
113 public static int DivRem (int a, int b, out int result)
119 public static long DivRem (long a, long b, out long result)
122 return (long)(a / b);
126 [MethodImplAttribute (MethodImplOptions.InternalCall)]
127 public extern static double Floor (double value);
129 public static double IEEERemainder (double x, double y)
134 r = x - (y * Math.Round(x/y));
137 return (x > 0) ? 0: (BitConverter.Int64BitsToDouble (Int64.MinValue));
140 public static double Log (double a, double newBase)
142 double result = Log(a) / Log(newBase);
143 return (result == -0)? 0: result;
147 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
149 public static byte Max (byte val1, byte val2)
151 return (val1 > val2)? val1: val2;
155 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
157 public static decimal Max (decimal val1, decimal val2)
159 return (val1 > val2)? val1: val2;
163 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
165 public static double Max (double val1, double val2)
167 if (Double.IsNaN (val1) || Double.IsNaN (val2)) {
170 return (val1 > val2)? val1: val2;
174 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
176 public static float Max (float val1, float val2)
178 if (Single.IsNaN (val1) || Single.IsNaN (val2)) {
181 return (val1 > val2)? val1: val2;
185 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
187 public static int Max (int val1, int val2)
189 return (val1 > val2)? val1: val2;
193 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
195 public static long Max (long val1, long val2)
197 return (val1 > val2)? val1: val2;
201 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
203 [CLSCompliant (false)]
204 public static sbyte Max (sbyte val1, sbyte val2)
206 return (val1 > val2)? val1: val2;
210 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
212 public static short Max (short val1, short val2)
214 return (val1 > val2)? val1: val2;
218 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
220 [CLSCompliant (false)]
221 public static uint Max (uint val1, uint val2)
223 return (val1 > val2)? val1: val2;
227 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
229 [CLSCompliant (false)]
230 public static ulong Max (ulong val1, ulong val2)
232 return (val1 > val2)? val1: val2;
236 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
238 [CLSCompliant (false)]
239 public static ushort Max (ushort val1, ushort val2)
241 return (val1 > val2)? val1: val2;
245 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
247 public static byte Min (byte val1, byte val2)
249 return (val1 < val2)? val1: val2;
253 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
255 public static decimal Min (decimal val1, decimal val2)
257 return (val1 < val2)? val1: val2;
261 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
263 public static double Min (double val1, double val2)
265 if (Double.IsNaN (val1) || Double.IsNaN (val2)) {
268 return (val1 < val2)? val1: val2;
272 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
274 public static float Min (float val1, float val2)
276 if (Single.IsNaN (val1) || Single.IsNaN (val2)) {
279 return (val1 < val2)? val1: val2;
283 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
285 public static int Min (int val1, int val2)
287 return (val1 < val2)? val1: val2;
291 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
293 public static long Min (long val1, long val2)
295 return (val1 < val2)? val1: val2;
299 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
301 [CLSCompliant (false)]
302 public static sbyte Min (sbyte val1, sbyte val2)
304 return (val1 < val2)? val1: val2;
308 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
310 public static short Min (short val1, short val2)
312 return (val1 < val2)? val1: val2;
316 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
318 [CLSCompliant (false)]
319 public static uint Min (uint val1, uint val2)
321 return (val1 < val2)? val1: val2;
325 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
327 [CLSCompliant (false)]
328 public static ulong Min (ulong val1, ulong val2)
330 return (val1 < val2)? val1: val2;
334 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
336 [CLSCompliant (false)]
337 public static ushort Min (ushort val1, ushort val2)
339 return (val1 < val2)? val1: val2;
342 public static decimal Round (decimal d)
344 // Just call Decimal.Round(d, 0); when it rounds well.
345 decimal int_part = Decimal.Floor(d);
346 decimal dec_part = d - int_part;
347 if (((dec_part == 0.5M) &&
348 ((2.0M * ((int_part / 2.0M) -
349 Decimal.Floor(int_part / 2.0M))) != 0.0M)) ||
356 public static decimal Round (decimal d, int decimals)
358 return Decimal.Round (d, decimals);
363 public static decimal Round (decimal d, MidpointRounding mode)
365 if ((mode != MidpointRounding.ToEven) && (mode != MidpointRounding.AwayFromZero))
366 throw new ArgumentException ("The value '" + mode + "' is not valid for this usage of the type MidpointRounding.", "mode");
368 if (mode == MidpointRounding.ToEven)
370 throw new NotImplementedException ();
374 public static decimal Round (decimal d, int decimals, MidpointRounding mode)
376 if ((mode != MidpointRounding.ToEven) && (mode != MidpointRounding.AwayFromZero))
377 throw new ArgumentException ("The value '" + mode + "' is not valid for this usage of the type MidpointRounding.", "mode");
379 if (mode == MidpointRounding.ToEven)
380 return Round (d, decimals);
381 throw new NotImplementedException ();
385 [MethodImplAttribute (MethodImplOptions.InternalCall)]
386 public extern static double Round (double d);
388 public static double Round (double value, int digits)
390 if (digits < 0 || digits > 15)
391 throw new ArgumentOutOfRangeException (Locale.GetText ("Value is too small or too big."));
393 return Round2(value, digits);
396 [MethodImplAttribute (MethodImplOptions.InternalCall)]
397 private extern static double Round2 (double value, int digits);
401 public static double Round (double value, MidpointRounding mode)
403 if ((mode != MidpointRounding.ToEven) && (mode != MidpointRounding.AwayFromZero))
404 throw new ArgumentException ("The value '" + mode + "' is not valid for this usage of the type MidpointRounding.", "mode");
406 if (mode == MidpointRounding.ToEven)
407 return Round (value);
409 return Floor (value + 0.5);
411 return Ceiling (value - 0.5);
415 public static double Round (double value, int digits, MidpointRounding mode)
417 if ((mode != MidpointRounding.ToEven) && (mode != MidpointRounding.AwayFromZero))
418 throw new ArgumentException ("The value '" + mode + "' is not valid for this usage of the type MidpointRounding.", "mode");
420 if (mode == MidpointRounding.ToEven)
421 return Round (value, digits);
422 throw new NotImplementedException ();
425 public static double Truncate (double d)
435 public static decimal Truncate (decimal d)
437 return Decimal.Truncate (d);
441 public static int Sign (decimal value)
443 if (value > 0) return 1;
444 return (value == 0)? 0: -1;
447 public static int Sign (double value)
449 if (Double.IsNaN (value))
450 throw new ArithmeticException ("NAN");
451 if (value > 0) return 1;
452 return (value == 0)? 0: -1;
455 public static int Sign (float value)
457 if (Single.IsNaN (value))
458 throw new ArithmeticException ("NAN");
459 if (value > 0) return 1;
460 return (value == 0)? 0: -1;
463 public static int Sign (int value)
465 if (value > 0) return 1;
466 return (value == 0)? 0: -1;
469 public static int Sign (long value)
471 if (value > 0) return 1;
472 return (value == 0)? 0: -1;
475 [CLSCompliant (false)]
476 public static int Sign (sbyte value)
478 if (value > 0) return 1;
479 return (value == 0)? 0: -1;
482 public static int Sign (short value)
484 if (value > 0) return 1;
485 return (value == 0)? 0: -1;
489 [MethodImplAttribute (MethodImplOptions.InternalCall)]
490 public extern static double Sin (double x);
492 [MethodImplAttribute (MethodImplOptions.InternalCall)]
493 public extern static double Cos (double x);
495 [MethodImplAttribute (MethodImplOptions.InternalCall)]
496 public extern static double Tan (double x);
498 [MethodImplAttribute (MethodImplOptions.InternalCall)]
499 public extern static double Sinh (double x);
501 [MethodImplAttribute (MethodImplOptions.InternalCall)]
502 public extern static double Cosh (double x);
504 [MethodImplAttribute (MethodImplOptions.InternalCall)]
505 public extern static double Tanh (double x);
507 [MethodImplAttribute (MethodImplOptions.InternalCall)]
508 public extern static double Acos (double x);
510 [MethodImplAttribute (MethodImplOptions.InternalCall)]
511 public extern static double Asin (double x);
513 [MethodImplAttribute (MethodImplOptions.InternalCall)]
514 public extern static double Atan (double x);
516 [MethodImplAttribute (MethodImplOptions.InternalCall)]
517 public extern static double Atan2 (double y, double x);
519 [MethodImplAttribute (MethodImplOptions.InternalCall)]
520 public extern static double Exp (double x);
522 [MethodImplAttribute (MethodImplOptions.InternalCall)]
523 public extern static double Log (double x);
525 [MethodImplAttribute (MethodImplOptions.InternalCall)]
526 public extern static double Log10 (double x);
528 [MethodImplAttribute (MethodImplOptions.InternalCall)]
529 public extern static double Pow (double x, double y);
531 [MethodImplAttribute (MethodImplOptions.InternalCall)]
533 [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
535 public extern static double Sqrt (double x);