(DISTFILES): Comment out a few missing files.
[mono-project.git] / mcs / class / corlib / System / Math.cs
blobdb788210aa5bb210f31ef2a8d6437a0ea5727696
1 //
2 // System.Math.cs
3 //
4 // Authors:
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)
9 //
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:
21 //
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
24 //
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;
36 namespace System
38 public sealed class Math
40 public const double E = 2.7182818284590452354;
41 public const double PI = 3.14159265358979323846;
43 private Math ()
47 public static decimal Abs (decimal value)
49 return (value < 0)? -value: value;
52 public static double Abs (double value)
54 return (value < 0)? -value: value;
57 public static float Abs (float value)
59 return (value < 0)? -value: value;
62 public static int Abs (int value)
64 if (value == Int32.MinValue)
65 throw new OverflowException (Locale.GetText ("Value is too small."));
66 return (value < 0)? -value: value;
69 public static long Abs (long value)
71 if (value == Int64.MinValue)
72 throw new OverflowException (Locale.GetText ("Value is too small."));
73 return (value < 0)? -value: value;
76 [CLSCompliant (false)]
77 public static sbyte Abs (sbyte value)
79 if (value == SByte.MinValue)
80 throw new OverflowException (Locale.GetText ("Value is too small."));
81 return (sbyte)((value < 0)? -value: value);
84 public static short Abs (short value)
86 if (value == Int16.MinValue)
87 throw new OverflowException (Locale.GetText ("Value is too small."));
88 return (short)((value < 0)? -value: value);
91 public static double Ceiling (double a)
93 double result = Floor(a);
94 if (result != a) {
95 result++;
97 return result;
100 // The following methods are defined in ECMA specs but they are
101 // not implemented in MS.NET. However, they are in MS.NET 1.1
103 #if (!NET_1_0)
104 public static long BigMul (int a, int b)
106 return ((long)a * (long)b);
109 public static int DivRem (int a, int b, out int result)
111 result = (a % b);
112 return (int)(a / b);
115 public static long DivRem (long a, long b, out long result)
117 result = (a % b);
118 return (long)(a / b);
120 #endif
122 [MethodImplAttribute (MethodImplOptions.InternalCall)]
123 public extern static double Floor (double value);
125 public static double IEEERemainder (double x, double y)
127 double r;
128 if (y == 0)
129 return Double.NaN;
130 r = x - (y * Math.Round(x/y));
131 if (r != 0)
132 return r;
133 return (x > 0) ? 0: (BitConverter.Int64BitsToDouble (Int64.MinValue));
136 public static double Log (double a, double newBase)
138 double result = Log(a) / Log(newBase);
139 return (result == -0)? 0: result;
142 public static byte Max (byte val1, byte val2)
144 return (val1 > val2)? val1: val2;
147 public static decimal Max (decimal val1, decimal val2)
149 return (val1 > val2)? val1: val2;
152 public static double Max (double val1, double val2)
154 if (Double.IsNaN (val1) || Double.IsNaN (val2)) {
155 return Double.NaN;
157 return (val1 > val2)? val1: val2;
160 public static float Max (float val1, float val2)
162 if (Single.IsNaN (val1) || Single.IsNaN (val2)) {
163 return Single.NaN;
165 return (val1 > val2)? val1: val2;
168 public static int Max (int val1, int val2)
170 return (val1 > val2)? val1: val2;
173 public static long Max (long val1, long val2)
175 return (val1 > val2)? val1: val2;
178 [CLSCompliant (false)]
179 public static sbyte Max (sbyte val1, sbyte val2)
181 return (val1 > val2)? val1: val2;
184 public static short Max (short val1, short val2)
186 return (val1 > val2)? val1: val2;
189 [CLSCompliant (false)]
190 public static uint Max (uint val1, uint val2)
192 return (val1 > val2)? val1: val2;
195 [CLSCompliant (false)]
196 public static ulong Max (ulong val1, ulong val2)
198 return (val1 > val2)? val1: val2;
201 [CLSCompliant (false)]
202 public static ushort Max (ushort val1, ushort val2)
204 return (val1 > val2)? val1: val2;
207 public static byte Min (byte val1, byte val2)
209 return (val1 < val2)? val1: val2;
212 public static decimal Min (decimal val1, decimal val2)
214 return (val1 < val2)? val1: val2;
217 public static double Min (double val1, double val2)
219 if (Double.IsNaN (val1) || Double.IsNaN (val2)) {
220 return Double.NaN;
222 return (val1 < val2)? val1: val2;
225 public static float Min (float val1, float val2)
227 if (Single.IsNaN (val1) || Single.IsNaN (val2)) {
228 return Single.NaN;
230 return (val1 < val2)? val1: val2;
233 public static int Min (int val1, int val2)
235 return (val1 < val2)? val1: val2;
238 public static long Min (long val1, long val2)
240 return (val1 < val2)? val1: val2;
243 [CLSCompliant (false)]
244 public static sbyte Min (sbyte val1, sbyte val2)
246 return (val1 < val2)? val1: val2;
249 public static short Min (short val1, short val2)
251 return (val1 < val2)? val1: val2;
254 [CLSCompliant (false)]
255 public static uint Min (uint val1, uint val2)
257 return (val1 < val2)? val1: val2;
260 [CLSCompliant (false)]
261 public static ulong Min (ulong val1, ulong val2)
263 return (val1 < val2)? val1: val2;
266 [CLSCompliant (false)]
267 public static ushort Min (ushort val1, ushort val2)
269 return (val1 < val2)? val1: val2;
272 public static decimal Round (decimal d)
274 // Just call Decimal.Round(d, 0); when it rounds well.
275 decimal int_part = Decimal.Floor(d);
276 decimal dec_part = d - int_part;
277 if (((dec_part == 0.5M) &&
278 ((2.0M * ((int_part / 2.0M) -
279 Decimal.Floor(int_part / 2.0M))) != 0.0M)) ||
280 (dec_part > 0.5M)) {
281 int_part++;
283 return int_part;
286 public static decimal Round (decimal d, int decimals)
288 return Decimal.Round (d, decimals);
291 [MethodImplAttribute (MethodImplOptions.InternalCall)]
292 public extern static double Round (double d);
294 public static double Round (double value, int digits)
296 if (digits < 0 || digits > 15)
297 throw new ArgumentOutOfRangeException (Locale.GetText ("Value is too small or too big."));
299 return Round2(value, digits);
302 [MethodImplAttribute (MethodImplOptions.InternalCall)]
303 private extern static double Round2 (double value, int digits);
305 public static int Sign (decimal value)
307 if (value > 0) return 1;
308 return (value == 0)? 0: -1;
311 public static int Sign (double value)
313 if (Double.IsNaN (value))
314 throw new ArithmeticException ("NAN");
315 if (value > 0) return 1;
316 return (value == 0)? 0: -1;
319 public static int Sign (float value)
321 if (Single.IsNaN (value))
322 throw new ArithmeticException ("NAN");
323 if (value > 0) return 1;
324 return (value == 0)? 0: -1;
327 public static int Sign (int value)
329 if (value > 0) return 1;
330 return (value == 0)? 0: -1;
333 public static int Sign (long value)
335 if (value > 0) return 1;
336 return (value == 0)? 0: -1;
339 [CLSCompliant (false)]
340 public static int Sign (sbyte value)
342 if (value > 0) return 1;
343 return (value == 0)? 0: -1;
346 public static int Sign (short value)
348 if (value > 0) return 1;
349 return (value == 0)? 0: -1;
352 // internal calls
353 [MethodImplAttribute (MethodImplOptions.InternalCall)]
354 public extern static double Sin (double x);
356 [MethodImplAttribute (MethodImplOptions.InternalCall)]
357 public extern static double Cos (double x);
359 [MethodImplAttribute (MethodImplOptions.InternalCall)]
360 public extern static double Tan (double x);
362 [MethodImplAttribute (MethodImplOptions.InternalCall)]
363 public extern static double Sinh (double x);
365 [MethodImplAttribute (MethodImplOptions.InternalCall)]
366 public extern static double Cosh (double x);
368 [MethodImplAttribute (MethodImplOptions.InternalCall)]
369 public extern static double Tanh (double x);
371 [MethodImplAttribute (MethodImplOptions.InternalCall)]
372 public extern static double Acos (double x);
374 [MethodImplAttribute (MethodImplOptions.InternalCall)]
375 public extern static double Asin (double x);
377 [MethodImplAttribute (MethodImplOptions.InternalCall)]
378 public extern static double Atan (double x);
380 [MethodImplAttribute (MethodImplOptions.InternalCall)]
381 public extern static double Atan2 (double y, double x);
383 [MethodImplAttribute (MethodImplOptions.InternalCall)]
384 public extern static double Exp (double x);
386 [MethodImplAttribute (MethodImplOptions.InternalCall)]
387 public extern static double Log (double x);
389 [MethodImplAttribute (MethodImplOptions.InternalCall)]
390 public extern static double Log10 (double x);
392 [MethodImplAttribute (MethodImplOptions.InternalCall)]
393 public extern static double Pow (double x, double y);
395 [MethodImplAttribute (MethodImplOptions.InternalCall)]
396 public extern static double Sqrt (double x);