OSDN Git Service

PR go/52358
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Apr 2012 16:33:01 +0000 (16:33 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Apr 2012 16:33:01 +0000 (16:33 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@186914 138bc75d-0d04-0410-961f-82ee72b054a4

libgo/go/math/ldexp.go

index 32c9853..4c63edd 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 {