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>
        {-1, -1075},
        {1, 1024},
        {-1, 1024},
+       {1.0000000000000002, -1075},
+       {1, -1075},
 }
 var ldexpBC = []float64{
        SmallestNonzeroFloat64,
        Copysign(0, -1),
        Inf(1),
        Inf(-1),
+       SmallestNonzeroFloat64,
+       0,
 }
 
 var logbBC = []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
        }
        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