re PR go/52358 (math FAILs on Solaris 8 and 9)
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 27 Apr 2012 16:32:42 +0000 (16:32 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 27 Apr 2012 16:32:42 +0000 (16:32 +0000)
PR go/52358
math: Work around bug in Solaris 9 implementation of ldexp.

The bug is that ldexp(-1, -1075) should return -0, but the
Solaris 9 implementation returns +0.

From-SVN: r186913

libgo/go/math/ldexp.go

index 32c9853204d267947436d6d6bfe53758146f0651..4c63edd73199f20cf55edd82a9ce06db6631c0e0 100644 (file)
@@ -16,7 +16,18 @@ package math
 func libc_ldexp(float64, int) float64
 
 func Ldexp(frac float64, exp int) float64 {
-       return libc_ldexp(frac, exp)
+       r := libc_ldexp(frac, exp)
+
+       // Work around a bug in the implementation of ldexp on Solaris
+       // 9.  If multiplying a negative number by 2 raised to a
+       // negative exponent underflows, we want to return negative
+       // zero, but the Solaris 9 implementation returns positive
+       // zero.  This workaround can be removed when and if we no
+       // longer care about Solaris 9.
+       if r == 0 && frac < 0 && exp < 0 {
+               r = Copysign(0, frac)
+       }
+       return r
 }
 
 func ldexp(frac float64, exp int) float64 {