[runtime] Fix test_op_il_seq_point in amd64.
[mono.git] / mcs / class / corlib / System / Math.cs
index df0fccd0e35ed2e6dc57dece2c5e790d60376483..3ba4b62399e354db2d9024e96e9dca09edf68a86 100644 (file)
 //
 
 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;
@@ -92,6 +85,15 @@ namespace System
                        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);
@@ -104,7 +106,6 @@ namespace System
                // 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);
@@ -121,10 +122,9 @@ namespace System
                        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)
                {
@@ -134,34 +134,31 @@ namespace System
                        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)) {
@@ -170,9 +167,7 @@ namespace System
                        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)) {
@@ -181,85 +176,65 @@ namespace System
                        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)) {
@@ -268,9 +243,7 @@ namespace System
                        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)) {
@@ -279,60 +252,46 @@ namespace System
                        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)
                {
@@ -358,8 +317,6 @@ namespace System
                        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))
@@ -367,37 +324,43 @@ namespace System
 
                        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))
@@ -411,17 +374,19 @@ namespace System
                                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)
@@ -436,7 +401,11 @@ namespace System
                {
                        return Decimal.Truncate (d);
                }
-#endif
+
+               public static decimal Floor (Decimal d)
+               {
+                       return Decimal.Floor (d);
+               }
 
                public static int Sign (decimal value)
                {
@@ -487,51 +456,49 @@ namespace System
 
                // 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);
        }
 }