Commit 92eb34b5 authored by Robert Griesemer's avatar Robert Griesemer

math/big: remove superfluous comparison

This is not a functional change.

Also:
- minor cleanups, better comments
- uniform spelling of noun "zeros" (per OED)

Fixes #11277.

Change-Id: I1726f358ce15907bd2410f646b02cf8b11b919cd
Reviewed-on: https://go-review.googlesource.com/11267Reviewed-by: 's avatarAlan Donovan <adonovan@google.com>
Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
parent db5eb2a2
...@@ -101,31 +101,31 @@ func (x *Int) Format(s fmt.State, ch rune) { ...@@ -101,31 +101,31 @@ func (x *Int) Format(s fmt.State, ch rune) {
digits := x.abs.string(cs) digits := x.abs.string(cs)
// number of characters for the three classes of number padding // number of characters for the three classes of number padding
var left int // space characters to left of digits for right justification ("%8d") var left int // space characters to left of digits for right justification ("%8d")
var zeroes int // zero characters (actually cs[0]) as left-most digits ("%.8d") var zeros int // zero characters (actually cs[0]) as left-most digits ("%.8d")
var right int // space characters to right of digits for left justification ("%-8d") var right int // space characters to right of digits for left justification ("%-8d")
// determine number padding from precision: the least number of digits to output // determine number padding from precision: the least number of digits to output
precision, precisionSet := s.Precision() precision, precisionSet := s.Precision()
if precisionSet { if precisionSet {
switch { switch {
case len(digits) < precision: case len(digits) < precision:
zeroes = precision - len(digits) // count of zero padding zeros = precision - len(digits) // count of zero padding
case digits == "0" && precision == 0: case digits == "0" && precision == 0:
return // print nothing if zero value (x == 0) and zero precision ("." or ".0") return // print nothing if zero value (x == 0) and zero precision ("." or ".0")
} }
} }
// determine field pad from width: the least number of characters to output // determine field pad from width: the least number of characters to output
length := len(sign) + len(prefix) + zeroes + len(digits) length := len(sign) + len(prefix) + zeros + len(digits)
if width, widthSet := s.Width(); widthSet && length < width { // pad as specified if width, widthSet := s.Width(); widthSet && length < width { // pad as specified
switch d := width - length; { switch d := width - length; {
case s.Flag('-'): case s.Flag('-'):
// pad on the right with spaces; supersedes '0' when both specified // pad on the right with spaces; supersedes '0' when both specified
right = d right = d
case s.Flag('0') && !precisionSet: case s.Flag('0') && !precisionSet:
// pad with zeroes unless precision also specified // pad with zeros unless precision also specified
zeroes = d zeros = d
default: default:
// pad on the left with spaces // pad on the left with spaces
left = d left = d
...@@ -136,7 +136,7 @@ func (x *Int) Format(s fmt.State, ch rune) { ...@@ -136,7 +136,7 @@ func (x *Int) Format(s fmt.State, ch rune) {
writeMultiple(s, " ", left) writeMultiple(s, " ", left)
writeMultiple(s, sign, 1) writeMultiple(s, sign, 1)
writeMultiple(s, prefix, 1) writeMultiple(s, prefix, 1)
writeMultiple(s, "0", zeroes) writeMultiple(s, "0", zeros)
writeMultiple(s, digits, 1) writeMultiple(s, digits, 1)
writeMultiple(s, " ", right) writeMultiple(s, " ", right)
} }
......
...@@ -252,14 +252,15 @@ func (x nat) hexString() string { ...@@ -252,14 +252,15 @@ func (x nat) hexString() string {
// by len(charset), which must be >= 2 and <= 256. // by len(charset), which must be >= 2 and <= 256.
func (x nat) string(charset string) string { func (x nat) string(charset string) string {
b := Word(len(charset)) b := Word(len(charset))
if b < 2 || b > 256 {
// special cases
switch {
case b < 2 || b > 256:
panic("invalid character set length") panic("invalid character set length")
case len(x) == 0: }
// x == 0
if len(x) == 0 {
return string(charset[0]) return string(charset[0])
} }
// len(x) > 0
// allocate buffer for conversion // allocate buffer for conversion
i := int(float64(x.bitLen())/math.Log2(float64(b))) + 1 // off by one at most i := int(float64(x.bitLen())/math.Log2(float64(b))) + 1 // off by one at most
...@@ -267,13 +268,13 @@ func (x nat) string(charset string) string { ...@@ -267,13 +268,13 @@ func (x nat) string(charset string) string {
// convert power of two and non power of two bases separately // convert power of two and non power of two bases separately
if b == b&-b { if b == b&-b {
// shift is base-b digit size in bits // shift is base b digit size in bits
shift := trailingZeroBits(b) // shift > 0 because b >= 2 shift := trailingZeroBits(b) // shift > 0 because b >= 2
mask := Word(1)<<shift - 1 mask := Word(1<<shift - 1)
w := x[0] w := x[0] // current word
nbits := uint(_W) // number of unprocessed bits in w nbits := uint(_W) // number of unprocessed bits in w
// convert less-significant words // convert less-significant words (include leading zeros)
for k := 1; k < len(x); k++ { for k := 1; k < len(x); k++ {
// convert full digits // convert full digits
for nbits >= shift { for nbits >= shift {
...@@ -289,7 +290,7 @@ func (x nat) string(charset string) string { ...@@ -289,7 +290,7 @@ func (x nat) string(charset string) string {
w = x[k] w = x[k]
nbits = _W nbits = _W
} else { } else {
// partial digit in current (k-1) and next (k) word // partial digit in current word w (== x[k-1]) and next word x[k]
w |= x[k] << nbits w |= x[k] << nbits
i-- i--
s[i] = charset[w&mask] s[i] = charset[w&mask]
...@@ -300,12 +301,11 @@ func (x nat) string(charset string) string { ...@@ -300,12 +301,11 @@ func (x nat) string(charset string) string {
} }
} }
// convert digits of most-significant word (omit leading zeros) // convert digits of most-significant word w (omit leading zeros)
for nbits >= 0 && w != 0 { for w != 0 {
i-- i--
s[i] = charset[w&mask] s[i] = charset[w&mask]
w >>= shift w >>= shift
nbits -= shift
} }
} else { } else {
...@@ -409,9 +409,9 @@ func (q nat) convertWords(s []byte, charset string, b Word, ndigits int, bb Word ...@@ -409,9 +409,9 @@ func (q nat) convertWords(s []byte, charset string, b Word, ndigits int, bb Word
} }
} }
// prepend high-order zeroes // prepend high-order zeros
zero := charset[0] zero := charset[0]
for i > 0 { // while need more leading zeroes for i > 0 { // while need more leading zeros
i-- i--
s[i] = zero s[i] = zero
} }
...@@ -425,7 +425,7 @@ var leafSize int = 8 // number of Word-size binary values treat as a monolithic ...@@ -425,7 +425,7 @@ var leafSize int = 8 // number of Word-size binary values treat as a monolithic
type divisor struct { type divisor struct {
bbb nat // divisor bbb nat // divisor
nbits int // bit length of divisor (discounting leading zeroes) ~= log2(bbb) nbits int // bit length of divisor (discounting leading zeros) ~= log2(bbb)
ndigits int // digit length of divisor in terms of output base digits ndigits int // digit length of divisor in terms of output base digits
} }
......
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