]> Cypherpunks repositories - gostls13.git/commitdiff
math/big: avoid unneeded sticky bit calculations
authorBrian Kessler <brian.m.kessler@gmail.com>
Wed, 9 Aug 2017 07:09:07 +0000 (00:09 -0700)
committerRobert Griesemer <gri@golang.org>
Fri, 11 Aug 2017 09:52:30 +0000 (09:52 +0000)
As noted in the TODO comment, the sticky bit is only used
when the rounding bit is zero or the rounding mode is
ToNearestEven.  This change makes that check explicit and
will eliminate half the sticky bit calculations on average
when rounding mode is not ToNearestEven.

Change-Id: Ia4709f08f46e682bf97dabe5eb2a10e8e3d7af43
Reviewed-on: https://go-review.googlesource.com/54111
Reviewed-by: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>

src/math/big/float.go

index 7e11f1aff5815ad467ff012dd443eb9f2f2450d3..afbed306f3d67f795c10b18419ec3846340e8208 100644 (file)
@@ -415,8 +415,9 @@ func (z *Float) round(sbit uint) {
        // bits > z.prec: mantissa too large => round
        r := uint(bits - z.prec - 1) // rounding bit position; r >= 0
        rbit := z.mant.bit(r) & 1    // rounding bit; be safe and ensure it's a single bit
-       if sbit == 0 {
-               // TODO(gri) if rbit != 0 we don't need to compute sbit for some rounding modes (optimization)
+       // The sticky bit is only needed for rounding ToNearestEven
+       // or when the rounding bit is zero. Avoid computation otherwise.
+       if sbit == 0 && (rbit == 0 || z.mode == ToNearestEven) {
                sbit = z.mant.sticky(r)
        }
        sbit &= 1 // be safe and ensure it's a single bit