mirror of
https://github.com/golang/go.git
synced 2025-05-30 19:52:53 +00:00
math/big: correctly handle large exponent in SetString
Even though the umul/uquo functions expect two valid, finite big.Floats arguments, SetString was calling them with possibly Inf values, which resulted in bogus return values. Replace umul and udiv calls with Mul and Quo calls to fix this. Also, fix two wrong tests. See relevant issue on issue tracker for a detailed explanation. Fixes #11341 Change-Id: Ie35222763a57a2d712a5f5f7baec75cab8189a53 Reviewed-on: https://go-review.googlesource.com/13778 Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
92eb34b59a
commit
13b5dc885b
@ -125,9 +125,9 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) {
|
||||
// apply 10**exp10
|
||||
p := new(Float).SetPrec(z.Prec() + 64) // use more bits for p -- TODO(gri) what is the right number?
|
||||
if exp10 < 0 {
|
||||
z.uquo(z, p.pow10(-exp10))
|
||||
z.Quo(z, p.pow10(-exp10))
|
||||
} else {
|
||||
z.umul(z, p.pow10(exp10))
|
||||
z.Mul(z, p.pow10(exp10))
|
||||
}
|
||||
|
||||
return
|
||||
|
@ -367,9 +367,9 @@ func TestFloatText(t *testing.T) {
|
||||
|
||||
// make sure "stupid" exponents don't stall the machine
|
||||
{"1e1000000", 64, 'p', 0, "0x.88b3a28a05eade3ap+3321929"},
|
||||
{"1e1000000000", 64, 'p', 0, "0x.ecc5f45aa573d3p+1538481529"},
|
||||
{"1e1000000000", 64, 'p', 0, "+Inf"},
|
||||
{"1e-1000000", 64, 'p', 0, "0x.efb4542cc8ca418ap-3321928"},
|
||||
{"1e-1000000000", 64, 'p', 0, "0x.8a64dd983a4c7dabp-1538481528"},
|
||||
{"1e-1000000000", 64, 'p', 0, "0"},
|
||||
|
||||
// TODO(gri) need tests for actual large Floats
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user