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
;
38 public sealed class Math
40 public const double E
= 2.7182818284590452354;
41 public const double PI
= 3.14159265358979323846;
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
);
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
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
)
115 public static long DivRem (long a
, long b
, out long result
)
118 return (long)(a
/ b
);
122 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
123 public extern static double Floor (double value);
125 public static double IEEERemainder (double x
, double y
)
130 r
= x
- (y
* Math
.Round(x
/y
));
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
)) {
157 return (val1
> val2
)? val1
: val2
;
160 public static float Max (float val1
, float val2
)
162 if (Single
.IsNaN (val1
) || Single
.IsNaN (val2
)) {
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
)) {
222 return (val1
< val2
)? val1
: val2
;
225 public static float Min (float val1
, float val2
)
227 if (Single
.IsNaN (val1
) || Single
.IsNaN (val2
)) {
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
)) ||
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;
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
);