]> Cypherpunks repositories - gostls13.git/commitdiff
math/big: fix aliasing bug in Float.Quo
authorRobert Griesemer <gri@golang.org>
Sat, 14 Feb 2015 04:15:40 +0000 (20:15 -0800)
committerRobert Griesemer <gri@golang.org>
Sat, 14 Feb 2015 04:22:56 +0000 (04:22 +0000)
TBR r, adonovan

Change-Id: I1a38e2d724bf1147c7307a7e5ae855c42c60428c
Reviewed-on: https://go-review.googlesource.com/4875
Reviewed-by: Robert Griesemer <gri@golang.org>
src/math/big/float.go

index dd6700137befbf0f812532916b33c25cedf7b918..314fd689ed1f1e63ca68330be1a2ad420a7dffb2 100644 (file)
@@ -967,12 +967,16 @@ func (z *Float) uquo(x, y *Float) {
        // to shorten x for faster division. But we must be extra careful
        // with rounding in that case.
 
+       // Compute d before division since there may be aliasing of x.mant
+       // (via xadj) or y.mant with z.mant.
+       d := len(xadj) - len(y.mant)
+
        // divide
        var r nat
        z.mant, r = z.mant.div(nil, xadj, y.mant)
 
        // determine exponent
-       e := int64(x.exp) - int64(y.exp) - int64(len(xadj)-len(y.mant)-len(z.mant))*_W
+       e := int64(x.exp) - int64(y.exp) - int64(d-len(z.mant))*_W
 
        // normalize mantissa
        z.setExp(e - int64(fnorm(z.mant)))