X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsysmath.c;h=d354c4d0cced1b6a82961e0078b0f1886057b3a4;hb=284b8b6a50c80a2513eed411084eebe5b2bd5ac4;hp=51603830154c6d52dd98cb966e5c15b355a7f0e6;hpb=c04c40760d13b2b46c34ee61fe9e0de47eaf1fbd;p=mono.git diff --git a/mono/metadata/sysmath.c b/mono/metadata/sysmath.c index 51603830154..d354c4d0cce 100644 --- a/mono/metadata/sysmath.c +++ b/mono/metadata/sysmath.c @@ -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 #include @@ -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