]> Cypherpunks repositories - gostls13.git/commitdiff
math: fix Ldexp when result is below ldexp(2, -1075)
authorWèi Cōngruì <crvv.mail@gmail.com>
Thu, 11 Jan 2018 05:11:12 +0000 (13:11 +0800)
committerRobert Griesemer <gri@golang.org>
Thu, 29 Mar 2018 23:14:13 +0000 (23:14 +0000)
Before this change, the smallest result Ldexp can handle was
ldexp(2, -1075), which is SmallestNonzeroFloat64.
There are some numbers below it should also be rounded to
SmallestNonzeroFloat64. The change fixes this.

Fixes #23407

Change-Id: I76f4cb005a6e9ccdd95b5e5c734079fd5d29e4aa
Reviewed-on: https://go-review.googlesource.com/87338
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/math/all_test.go
src/math/ldexp.go

index a145c5e60b6aabdb9607f1ee5ca0650f9cce6450..1ac8ce886c0a4237660405f135a5dcc1cbc0f9a9 100644 (file)
@@ -1967,6 +1967,8 @@ var vfldexpBC = []fi{
        {-1, -1075},
        {1, 1024},
        {-1, 1024},
+       {1.0000000000000002, -1075},
+       {1, -1075},
 }
 var ldexpBC = []float64{
        SmallestNonzeroFloat64,
@@ -1977,6 +1979,8 @@ var ldexpBC = []float64{
        Copysign(0, -1),
        Inf(1),
        Inf(-1),
+       SmallestNonzeroFloat64,
+       0,
 }
 
 var logbBC = []float64{
index b5d2a5e7e83b4431470c7fac10dac9a56202c916..aa50a49adece8d15b1da7332c1980f6970a721ca 100644 (file)
@@ -25,7 +25,7 @@ func ldexp(frac float64, exp int) float64 {
        exp += e
        x := Float64bits(frac)
        exp += int(x>>shift)&mask - bias
-       if exp < -1074 {
+       if exp < -1075 {
                return Copysign(0, frac) // underflow
        }
        if exp > 1023 { // overflow
@@ -36,8 +36,8 @@ func ldexp(frac float64, exp int) float64 {
        }
        var m float64 = 1
        if exp < -1022 { // denormal
-               exp += 52
-               m = 1.0 / (1 << 52) // 2**-52
+               exp += 53
+               m = 1.0 / (1 << 53) // 2**-53
        }
        x &^= mask << shift
        x |= uint64(exp+bias) << shift