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