Move ssb thread registration and globals to its file.
[mono.git] / mono / metadata / sysmath.c
index 51603830154c6d52dd98cb966e5c15b355a7f0e6..d354c4d0cced1b6a82961e0078b0f1886057b3a4 100644 (file)
@@ -1,5 +1,12 @@
-/* math.c - these are based on bob smith's csharp routines */
-
+/*
+ * sysmath.c: these are based on bob smith's csharp routines 
+ *
+ * Author:
+ *     Mono Project (http://www.mono-project.com)
+ *
+ * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
+ * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
+ */
 #define __USE_ISOC99
 #include <math.h>
 #include <mono/metadata/sysmath.h>
@@ -49,7 +56,11 @@ gdouble ves_icall_System_Math_Round (gdouble x) {
 }
 
 gdouble ves_icall_System_Math_Round2 (gdouble value, gint32 digits, gboolean away_from_zero) {
-       double p, int_part, dec_part;
+#if !defined (HAVE_ROUND) || !defined (HAVE_RINT)
+       double int_part, dec_part;
+#endif
+       double p;
+
        MONO_ARCH_SAVE_REGS;
        if (value == HUGE_VAL)
                return HUGE_VAL;
@@ -58,6 +69,12 @@ gdouble ves_icall_System_Math_Round2 (gdouble value, gint32 digits, gboolean awa
        if (digits == 0)
                return ves_icall_System_Math_Round(value);
        p = pow(10, digits);
+#if defined (HAVE_ROUND) && defined (HAVE_RINT)
+       if (away_from_zero)
+               return round (value * p) / p;
+       else
+               return rint (value * p) / p;
+#else
        dec_part = modf (value, &int_part);
        dec_part *= 1000000000000000ULL;
        if (away_from_zero && dec_part > 0)
@@ -73,7 +90,8 @@ gdouble ves_icall_System_Math_Round2 (gdouble value, gint32 digits, gboolean awa
        } else
                dec_part = ves_icall_System_Math_Round (dec_part);
        dec_part /= p;
-       return int_part + dec_part;
+       return ves_icall_System_Math_Round ((int_part + dec_part) * p) / p;
+#endif
 }
 
 gdouble