First set of licensing changes
[mono.git] / mono / metadata / sysmath.c
index 45dc2ea04c4eec15ff861fa03b9e3e11777fbd62..8d55a552f84dbc86d35b01deea7793039e7b007d 100644 (file)
@@ -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.
  */
 
 //
@@ -264,9 +265,19 @@ ves_icall_System_Math_Pow (gdouble x, gdouble y)
                result = PInfinity.d;
 
 #if defined (__linux__) && SIZEOF_VOID_P == 4
-       /* On Linux 32bits, Math.Pow (-1, Double.MaxValue) would return NaN instead of 1 */
-       if (isnan (result) && isminusone (x) && (y > 9007199254740991.0 || y < -9007199254740991.0))
-               result = POne.d;
+       /* 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;