X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem%2FMath.cs;h=3ba4b62399e354db2d9024e96e9dca09edf68a86;hb=e3a2538f4e5785fb9f4ce0474ebc18864f789496;hp=df0fccd0e35ed2e6dc57dece2c5e790d60376483;hpb=2007998771b1c4d9e762943676d7959daaf74385;p=mono.git diff --git a/mcs/class/corlib/System/Math.cs b/mcs/class/corlib/System/Math.cs index df0fccd0e35..3ba4b62399e 100644 --- a/mcs/class/corlib/System/Math.cs +++ b/mcs/class/corlib/System/Math.cs @@ -32,22 +32,15 @@ // 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); } }