diff --git a/decor/decorators.go b/decor/decorators.go index 70b8a97..e427f74 100644 --- a/decor/decorators.go +++ b/decor/decorators.go @@ -270,7 +270,7 @@ } var str string - timeRemaining := time.Duration(st.Total-st.Current) * time.Duration(math.Round(s.Value())) + timeRemaining := time.Duration(st.Total-st.Current) * time.Duration(round(s.Value())) hours := int64((timeRemaining / time.Hour) % 60) minutes := int64((timeRemaining / time.Minute) % 60) seconds := int64((timeRemaining / time.Second) % 60) @@ -354,7 +354,7 @@ } p := float64(width) * float64(current) / float64(total) - return int64(math.Round(p)) + return int64(round(p)) } // SpeedNoUnit returns raw I/O operation speed decorator. diff --git a/decor/round.go b/decor/round.go new file mode 100644 index 0000000..5ca3b70 --- /dev/null +++ b/decor/round.go @@ -0,0 +1,49 @@ +package decor + +import "math" + +const ( + uvone = 0x3FF0000000000000 + mask = 0x7FF + shift = 64 - 11 - 1 + bias = 1023 + signMask = 1 << 63 + fracMask = 1<= 0.5 { + // return t + Copysign(1, x) + // } + // return t + // } + bits := math.Float64bits(x) + e := uint(bits>>shift) & mask + if e < bias { + // Round abs(x) < 1 including denormals. + bits &= signMask // +-0 + if e == bias-1 { + bits |= uvone // +-1 + } + } else if e < bias+shift { + // Round any abs(x) >= 1 containing a fractional component [0,1). + // + // Numbers with larger exponents are returned unchanged since they + // must be either an integer, infinity, or NaN. + const half = 1 << (shift - 1) + e -= bias + bits += half >> e + bits &^= fracMask >> e + } + return math.Float64frombits(bits) +}