//
using System.Runtime.CompilerServices;
-
-#if NET_2_0
using System.Runtime.ConstrainedExecution;
-#endif
namespace System
{
- public sealed class Math
+ public static class Math
{
public const double E = 2.7182818284590452354;
public const double PI = 3.14159265358979323846;
- private Math ()
- {
- }
-
public static decimal Abs (decimal value)
{
return (value < 0)? -value: value;
return (short)((value < 0)? -value: value);
}
+ public static decimal Ceiling (decimal d)
+ {
+ decimal result = Floor(d);
+ if (result != d) {
+ result++;
+ }
+ return result;
+ }
+
public static double Ceiling (double a)
{
double result = Floor(a);
// The following methods are defined in ECMA specs but they are
// not implemented in MS.NET. However, they are in MS.NET 1.1
-#if (!NET_1_0)
public static long BigMul (int a, int b)
{
return ((long)a * (long)b);
result = (a % b);
return (long)(a / b);
}
-#endif
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Floor (double value);
+ public extern static double Floor (double d);
public static double IEEERemainder (double x, double y)
{
r = x - (y * Math.Round(x/y));
if (r != 0)
return r;
+ /* Int64BitsToDouble is not endian-aware, but that is fine here */
return (x > 0) ? 0: (BitConverter.Int64BitsToDouble (Int64.MinValue));
}
public static double Log (double a, double newBase)
{
+ if (newBase == 1.0)
+ return Double.NaN;
double result = Log(a) / Log(newBase);
return (result == -0)? 0: result;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static byte Max (byte val1, byte val2)
{
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static decimal Max (decimal val1, decimal val2)
{
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static double Max (double val1, double val2)
{
if (Double.IsNaN (val1) || Double.IsNaN (val2)) {
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static float Max (float val1, float val2)
{
if (Single.IsNaN (val1) || Single.IsNaN (val2)) {
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static int Max (int val1, int val2)
{
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static long Max (long val1, long val2)
{
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
[CLSCompliant (false)]
public static sbyte Max (sbyte val1, sbyte val2)
{
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static short Max (short val1, short val2)
{
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
[CLSCompliant (false)]
public static uint Max (uint val1, uint val2)
{
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
[CLSCompliant (false)]
public static ulong Max (ulong val1, ulong val2)
{
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
[CLSCompliant (false)]
public static ushort Max (ushort val1, ushort val2)
{
return (val1 > val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static byte Min (byte val1, byte val2)
{
return (val1 < val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static decimal Min (decimal val1, decimal val2)
{
return (val1 < val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static double Min (double val1, double val2)
{
if (Double.IsNaN (val1) || Double.IsNaN (val2)) {
return (val1 < val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static float Min (float val1, float val2)
{
if (Single.IsNaN (val1) || Single.IsNaN (val2)) {
return (val1 < val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static int Min (int val1, int val2)
{
return (val1 < val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static long Min (long val1, long val2)
{
return (val1 < val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
[CLSCompliant (false)]
public static sbyte Min (sbyte val1, sbyte val2)
{
return (val1 < val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
public static short Min (short val1, short val2)
{
return (val1 < val2)? val1: val2;
}
-#if NET_2_0
- [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
- [CLSCompliant (false)]
+ [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
+ [CLSCompliant (false)]
public static uint Min (uint val1, uint val2)
{
return (val1 < val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
[CLSCompliant (false)]
public static ulong Min (ulong val1, ulong val2)
{
return (val1 < val2)? val1: val2;
}
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
[CLSCompliant (false)]
public static ushort Min (ushort val1, ushort val2)
{
return Decimal.Round (d, decimals);
}
-#if NET_2_0
- [MonoTODO]
public static decimal Round (decimal d, MidpointRounding mode)
{
if ((mode != MidpointRounding.ToEven) && (mode != MidpointRounding.AwayFromZero))
if (mode == MidpointRounding.ToEven)
return Round (d);
- throw new NotImplementedException ();
+ else
+ return RoundAwayFromZero (d);
}
- [MonoTODO]
- public static decimal Round (decimal d, int decimals, MidpointRounding mode)
+ static decimal RoundAwayFromZero (decimal d)
{
- if ((mode != MidpointRounding.ToEven) && (mode != MidpointRounding.AwayFromZero))
- throw new ArgumentException ("The value '" + mode + "' is not valid for this usage of the type MidpointRounding.", "mode");
+ decimal int_part = Decimal.Floor(d);
+ decimal dec_part = d - int_part;
+ if (int_part >= 0 && dec_part >= 0.5M)
+ int_part++;
+ else if (int_part < 0 && dec_part > 0.5M)
+ int_part++;
+ return int_part;
+ }
- if (mode == MidpointRounding.ToEven)
- return Round (d, decimals);
- throw new NotImplementedException ();
+ public static decimal Round (decimal d, int decimals, MidpointRounding mode)
+ {
+ return Decimal.Round (d, decimals, mode);
}
-#endif
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Round (double d);
+ public extern static double Round (double a);
public static double Round (double value, int digits)
{
if (digits < 0 || digits > 15)
throw new ArgumentOutOfRangeException (Locale.GetText ("Value is too small or too big."));
+ if (digits == 0)
+ return Round (value);
- return Round2(value, digits);
+ return Round2(value, digits, false);
}
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- private extern static double Round2 (double value, int digits);
+ private extern static double Round2 (double value, int digits, bool away_from_zero);
-#if NET_2_0
public static double Round (double value, MidpointRounding mode)
{
if ((mode != MidpointRounding.ToEven) && (mode != MidpointRounding.AwayFromZero))
return Ceiling (value - 0.5);
}
- [MonoTODO]
public static double Round (double value, int digits, MidpointRounding mode)
{
if ((mode != MidpointRounding.ToEven) && (mode != MidpointRounding.AwayFromZero))
throw new ArgumentException ("The value '" + mode + "' is not valid for this usage of the type MidpointRounding.", "mode");
+ if (digits == 0)
+ return Round (value, mode);
if (mode == MidpointRounding.ToEven)
return Round (value, digits);
- throw new NotImplementedException ();
+ else
+ return Round2 (value, digits, true);
}
-
+
public static double Truncate (double d)
{
if (d > 0D)
{
return Decimal.Truncate (d);
}
-#endif
+
+ public static decimal Floor (Decimal d)
+ {
+ return Decimal.Floor (d);
+ }
public static int Sign (decimal value)
{
// internal calls
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Sin (double x);
+ public extern static double Sin (double a);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Cos (double x);
+ public extern static double Cos (double d);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Tan (double x);
+ public extern static double Tan (double a);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Sinh (double x);
+ public extern static double Sinh (double value);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Cosh (double x);
+ public extern static double Cosh (double value);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Tanh (double x);
+ public extern static double Tanh (double value);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Acos (double x);
+ public extern static double Acos (double d);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Asin (double x);
+ public extern static double Asin (double d);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Atan (double x);
+ public extern static double Atan (double d);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
public extern static double Atan2 (double y, double x);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Exp (double x);
+ public extern static double Exp (double d);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Log (double x);
+ public extern static double Log (double d);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
- public extern static double Log10 (double x);
+ public extern static double Log10 (double d);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
public extern static double Pow (double x, double y);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
-#if NET_2_0
[ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-#endif
- public extern static double Sqrt (double x);
+ public extern static double Sqrt (double d);
}
}