Commit 9c7bf080 authored by Brian Kessler's avatar Brian Kessler Committed by Robert Griesemer

math/big: avoid unneeded sticky bit calculations

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/54111Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
parent e9348ab4
...@@ -415,8 +415,9 @@ func (z *Float) round(sbit uint) { ...@@ -415,8 +415,9 @@ func (z *Float) round(sbit uint) {
// bits > z.prec: mantissa too large => round // bits > z.prec: mantissa too large => round
r := uint(bits - z.prec - 1) // rounding bit position; r >= 0 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 rbit := z.mant.bit(r) & 1 // rounding bit; be safe and ensure it's a single bit
if sbit == 0 { // The sticky bit is only needed for rounding ToNearestEven
// TODO(gri) if rbit != 0 we don't need to compute sbit for some rounding modes (optimization) // or when the rounding bit is zero. Avoid computation otherwise.
if sbit == 0 && (rbit == 0 || z.mode == ToNearestEven) {
sbit = z.mant.sticky(r) sbit = z.mant.sticky(r)
} }
sbit &= 1 // be safe and ensure it's a single bit sbit &= 1 // be safe and ensure it's a single bit
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment