Commit 0befa47a authored by Robert Griesemer's avatar Robert Griesemer

strconv: slightly simplified roundShortest; better comments

Change-Id: If886f15468680f7e1c589873066b4391eb9784b5
Reviewed-on: https://go-review.googlesource.com/14856Reviewed-by: 's avatarAlan Donovan <adonovan@google.com>
parent 59a6ba56
...@@ -286,25 +286,23 @@ func roundShortest(d *decimal, mant uint64, exp int, flt *floatInfo) { ...@@ -286,25 +286,23 @@ func roundShortest(d *decimal, mant uint64, exp int, flt *floatInfo) {
// Now we can figure out the minimum number of digits required. // Now we can figure out the minimum number of digits required.
// Walk along until d has distinguished itself from upper and lower. // Walk along until d has distinguished itself from upper and lower.
for i := 0; i < d.nd; i++ { for i := 0; i < d.nd; i++ {
var l, m, u byte // lower, middle, upper digits l := byte('0') // lower digit
if i < lower.nd { if i < lower.nd {
l = lower.d[i] l = lower.d[i]
} else {
l = '0'
} }
m = d.d[i] m := d.d[i] // middle digit
u := byte('0') // upper digit
if i < upper.nd { if i < upper.nd {
u = upper.d[i] u = upper.d[i]
} else {
u = '0'
} }
// Okay to round down (truncate) if lower has a different digit // Okay to round down (truncate) if lower has a different digit
// or if lower is inclusive and is exactly the result of rounding down. // or if lower is inclusive and is exactly the result of rounding
okdown := l != m || (inclusive && l == m && i+1 == lower.nd) // down (i.e., and we have reached the final digit of lower).
okdown := l != m || inclusive && i+1 == lower.nd
// Okay to round up if upper has a different digit and // Okay to round up if upper has a different digit and either upper
// either upper is inclusive or upper is bigger than the result of rounding up. // is inclusive or upper is bigger than the result of rounding up.
okup := m != u && (inclusive || m+1 < u || i+1 < upper.nd) okup := m != u && (inclusive || m+1 < u || i+1 < upper.nd)
// If it's okay to do either, then round to the nearest one. // If it's okay to do either, then round to the nearest one.
......
...@@ -18,7 +18,7 @@ type ftoaTest struct { ...@@ -18,7 +18,7 @@ type ftoaTest struct {
s string s string
} }
func fdiv(a, b float64) float64 { return a / b } // keep compiler in the dark func fdiv(a, b float64) float64 { return a / b }
const ( const (
below1e23 = 99999999999999974834176 below1e23 = 99999999999999974834176
...@@ -94,8 +94,8 @@ var ftoatests = []ftoaTest{ ...@@ -94,8 +94,8 @@ var ftoatests = []ftoaTest{
{above1e23, 'f', -1, "100000000000000010000000"}, {above1e23, 'f', -1, "100000000000000010000000"},
{above1e23, 'g', -1, "1.0000000000000001e+23"}, {above1e23, 'g', -1, "1.0000000000000001e+23"},
{fdiv(5e-304, 1e20), 'g', -1, "5e-324"}, {fdiv(5e-304, 1e20), 'g', -1, "5e-324"}, // avoid constant arithmetic
{fdiv(-5e-304, 1e20), 'g', -1, "-5e-324"}, {fdiv(-5e-304, 1e20), 'g', -1, "-5e-324"}, // avoid constant arithmetic
{32, 'g', -1, "32"}, {32, 'g', -1, "32"},
{32, 'g', 0, "3e+01"}, {32, 'g', 0, "3e+01"},
......
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