X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsysmath.c;h=8d55a552f84dbc86d35b01deea7793039e7b007d;hb=ef0ddf45c3081e799edcb4e95770186514b80cf1;hp=47cbcfd599f3281305c628b8e82f994c2dd3bb02;hpb=6723d1e5cc970ec89c146ceb6f8895db96057919;p=mono.git diff --git a/mono/metadata/sysmath.c b/mono/metadata/sysmath.c index 47cbcfd599f..8d55a552f84 100644 --- a/mono/metadata/sysmath.c +++ b/mono/metadata/sysmath.c @@ -8,6 +8,7 @@ * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com) * Copyright 2004-2009 Novell, Inc (http://www.novell.com) * Copyright 2015 Xamarin, Inc (https://www.xamarin.com) + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ // @@ -263,6 +264,22 @@ ves_icall_System_Math_Pow (gdouble x, gdouble y) if (result == MInfinity.d && x < 0.0 && isfinite (x) && ceil (y / 2) == floor (y / 2)) result = PInfinity.d; +#if defined (__linux__) && SIZEOF_VOID_P == 4 + /* On Linux 32bits, some tests erroneously return NaN */ + if (isnan (result)) { + if (isminusone (x) && (y > 9007199254740991.0 || y < -9007199254740991.0)) { + /* Math.Pow (-1, Double.MaxValue) and Math.Pow (-1, Double.MinValue) should return 1 */ + result = POne.d; + } else if (x < -9007199254740991.0 && y < -9007199254740991.0) { + /* Math.Pow (Double.MinValue, Double.MinValue) should return 0 */ + result = 0.0; + } else if (x < -9007199254740991.0 && y > 9007199254740991.0) { + /* Math.Pow (Double.MinValue, Double.MaxValue) should return Double.PositiveInfinity */ + result = PInfinity.d; + } + } +#endif + return result == -0.0 ? 0 : result; }