github.com/aclisp/heapster@v0.19.2-0.20160613100040-51756f899a96/Godeps/_workspace/src/gopkg.in/inf.v0/dec.go (about) 1 // Package inf (type inf.Dec) implements "infinite-precision" decimal 2 // arithmetic. 3 // "Infinite precision" describes two characteristics: practically unlimited 4 // precision for decimal number representation and no support for calculating 5 // with any specific fixed precision. 6 // (Although there is no practical limit on precision, inf.Dec can only 7 // represent finite decimals.) 8 // 9 // This package is currently in experimental stage and the API may change. 10 // 11 // This package does NOT support: 12 // - rounding to specific precisions (as opposed to specific decimal positions) 13 // - the notion of context (each rounding must be explicit) 14 // - NaN and Inf values, and distinguishing between positive and negative zero 15 // - conversions to and from float32/64 types 16 // 17 // Features considered for possible addition: 18 // + formatting options 19 // + Exp method 20 // + combined operations such as AddRound/MulAdd etc 21 // + exchanging data in decimal32/64/128 formats 22 // 23 package inf 24 25 // TODO: 26 // - avoid excessive deep copying (quo and rounders) 27 28 import ( 29 "fmt" 30 "io" 31 "math/big" 32 "strings" 33 ) 34 35 // A Dec represents a signed arbitrary-precision decimal. 36 // It is a combination of a sign, an arbitrary-precision integer coefficient 37 // value, and a signed fixed-precision exponent value. 38 // The sign and the coefficient value are handled together as a signed value 39 // and referred to as the unscaled value. 40 // (Positive and negative zero values are not distinguished.) 41 // Since the exponent is most commonly non-positive, it is handled in negated 42 // form and referred to as scale. 43 // 44 // The mathematical value of a Dec equals: 45 // 46 // unscaled * 10**(-scale) 47 // 48 // Note that different Dec representations may have equal mathematical values. 49 // 50 // unscaled scale String() 51 // ------------------------- 52 // 0 0 "0" 53 // 0 2 "0.00" 54 // 0 -2 "0" 55 // 1 0 "1" 56 // 100 2 "1.00" 57 // 10 0 "10" 58 // 1 -1 "10" 59 // 60 // The zero value for a Dec represents the value 0 with scale 0. 61 // 62 // Operations are typically performed through the *Dec type. 63 // The semantics of the assignment operation "=" for "bare" Dec values is 64 // undefined and should not be relied on. 65 // 66 // Methods are typically of the form: 67 // 68 // func (z *Dec) Op(x, y *Dec) *Dec 69 // 70 // and implement operations z = x Op y with the result as receiver; if it 71 // is one of the operands it may be overwritten (and its memory reused). 72 // To enable chaining of operations, the result is also returned. Methods 73 // returning a result other than *Dec take one of the operands as the receiver. 74 // 75 // A "bare" Quo method (quotient / division operation) is not provided, as the 76 // result is not always a finite decimal and thus in general cannot be 77 // represented as a Dec. 78 // Instead, in the common case when rounding is (potentially) necessary, 79 // QuoRound should be used with a Scale and a Rounder. 80 // QuoExact or QuoRound with RoundExact can be used in the special cases when it 81 // is known that the result is always a finite decimal. 82 // 83 type Dec struct { 84 unscaled big.Int 85 scale Scale 86 } 87 88 // Scale represents the type used for the scale of a Dec. 89 type Scale int32 90 91 const scaleSize = 4 // bytes in a Scale value 92 93 // Scaler represents a method for obtaining the scale to use for the result of 94 // an operation on x and y. 95 type scaler interface { 96 Scale(x *Dec, y *Dec) Scale 97 } 98 99 var bigInt = [...]*big.Int{ 100 big.NewInt(0), big.NewInt(1), big.NewInt(2), big.NewInt(3), big.NewInt(4), 101 big.NewInt(5), big.NewInt(6), big.NewInt(7), big.NewInt(8), big.NewInt(9), 102 big.NewInt(10), 103 } 104 105 var exp10cache [64]big.Int = func() [64]big.Int { 106 e10, e10i := [64]big.Int{}, bigInt[1] 107 for i, _ := range e10 { 108 e10[i].Set(e10i) 109 e10i = new(big.Int).Mul(e10i, bigInt[10]) 110 } 111 return e10 112 }() 113 114 // NewDec allocates and returns a new Dec set to the given int64 unscaled value 115 // and scale. 116 func NewDec(unscaled int64, scale Scale) *Dec { 117 return new(Dec).SetUnscaled(unscaled).SetScale(scale) 118 } 119 120 // NewDecBig allocates and returns a new Dec set to the given *big.Int unscaled 121 // value and scale. 122 func NewDecBig(unscaled *big.Int, scale Scale) *Dec { 123 return new(Dec).SetUnscaledBig(unscaled).SetScale(scale) 124 } 125 126 // Scale returns the scale of x. 127 func (x *Dec) Scale() Scale { 128 return x.scale 129 } 130 131 // Unscaled returns the unscaled value of x for u and true for ok when the 132 // unscaled value can be represented as int64; otherwise it returns an undefined 133 // int64 value for u and false for ok. Use x.UnscaledBig().Int64() to avoid 134 // checking the validity of the value when the check is known to be redundant. 135 func (x *Dec) Unscaled() (u int64, ok bool) { 136 u = x.unscaled.Int64() 137 var i big.Int 138 ok = i.SetInt64(u).Cmp(&x.unscaled) == 0 139 return 140 } 141 142 // UnscaledBig returns the unscaled value of x as *big.Int. 143 func (x *Dec) UnscaledBig() *big.Int { 144 return &x.unscaled 145 } 146 147 // SetScale sets the scale of z, with the unscaled value unchanged, and returns 148 // z. 149 // The mathematical value of the Dec changes as if it was multiplied by 150 // 10**(oldscale-scale). 151 func (z *Dec) SetScale(scale Scale) *Dec { 152 z.scale = scale 153 return z 154 } 155 156 // SetUnscaled sets the unscaled value of z, with the scale unchanged, and 157 // returns z. 158 func (z *Dec) SetUnscaled(unscaled int64) *Dec { 159 z.unscaled.SetInt64(unscaled) 160 return z 161 } 162 163 // SetUnscaledBig sets the unscaled value of z, with the scale unchanged, and 164 // returns z. 165 func (z *Dec) SetUnscaledBig(unscaled *big.Int) *Dec { 166 z.unscaled.Set(unscaled) 167 return z 168 } 169 170 // Set sets z to the value of x and returns z. 171 // It does nothing if z == x. 172 func (z *Dec) Set(x *Dec) *Dec { 173 if z != x { 174 z.SetUnscaledBig(x.UnscaledBig()) 175 z.SetScale(x.Scale()) 176 } 177 return z 178 } 179 180 // Sign returns: 181 // 182 // -1 if x < 0 183 // 0 if x == 0 184 // +1 if x > 0 185 // 186 func (x *Dec) Sign() int { 187 return x.UnscaledBig().Sign() 188 } 189 190 // Neg sets z to -x and returns z. 191 func (z *Dec) Neg(x *Dec) *Dec { 192 z.SetScale(x.Scale()) 193 z.UnscaledBig().Neg(x.UnscaledBig()) 194 return z 195 } 196 197 // Cmp compares x and y and returns: 198 // 199 // -1 if x < y 200 // 0 if x == y 201 // +1 if x > y 202 // 203 func (x *Dec) Cmp(y *Dec) int { 204 xx, yy := upscale(x, y) 205 return xx.UnscaledBig().Cmp(yy.UnscaledBig()) 206 } 207 208 // Abs sets z to |x| (the absolute value of x) and returns z. 209 func (z *Dec) Abs(x *Dec) *Dec { 210 z.SetScale(x.Scale()) 211 z.UnscaledBig().Abs(x.UnscaledBig()) 212 return z 213 } 214 215 // Add sets z to the sum x+y and returns z. 216 // The scale of z is the greater of the scales of x and y. 217 func (z *Dec) Add(x, y *Dec) *Dec { 218 xx, yy := upscale(x, y) 219 z.SetScale(xx.Scale()) 220 z.UnscaledBig().Add(xx.UnscaledBig(), yy.UnscaledBig()) 221 return z 222 } 223 224 // Sub sets z to the difference x-y and returns z. 225 // The scale of z is the greater of the scales of x and y. 226 func (z *Dec) Sub(x, y *Dec) *Dec { 227 xx, yy := upscale(x, y) 228 z.SetScale(xx.Scale()) 229 z.UnscaledBig().Sub(xx.UnscaledBig(), yy.UnscaledBig()) 230 return z 231 } 232 233 // Mul sets z to the product x*y and returns z. 234 // The scale of z is the sum of the scales of x and y. 235 func (z *Dec) Mul(x, y *Dec) *Dec { 236 z.SetScale(x.Scale() + y.Scale()) 237 z.UnscaledBig().Mul(x.UnscaledBig(), y.UnscaledBig()) 238 return z 239 } 240 241 // Round sets z to the value of x rounded to Scale s using Rounder r, and 242 // returns z. 243 func (z *Dec) Round(x *Dec, s Scale, r Rounder) *Dec { 244 return z.QuoRound(x, NewDec(1, 0), s, r) 245 } 246 247 // QuoRound sets z to the quotient x/y, rounded using the given Rounder to the 248 // specified scale. 249 // 250 // If the rounder is RoundExact but the result can not be expressed exactly at 251 // the specified scale, QuoRound returns nil, and the value of z is undefined. 252 // 253 // There is no corresponding Div method; the equivalent can be achieved through 254 // the choice of Rounder used. 255 // 256 func (z *Dec) QuoRound(x, y *Dec, s Scale, r Rounder) *Dec { 257 return z.quo(x, y, sclr{s}, r) 258 } 259 260 func (z *Dec) quo(x, y *Dec, s scaler, r Rounder) *Dec { 261 scl := s.Scale(x, y) 262 var zzz *Dec 263 if r.UseRemainder() { 264 zz, rA, rB := new(Dec).quoRem(x, y, scl, true, new(big.Int), new(big.Int)) 265 zzz = r.Round(new(Dec), zz, rA, rB) 266 } else { 267 zz, _, _ := new(Dec).quoRem(x, y, scl, false, nil, nil) 268 zzz = r.Round(new(Dec), zz, nil, nil) 269 } 270 if zzz == nil { 271 return nil 272 } 273 return z.Set(zzz) 274 } 275 276 // QuoExact sets z to the quotient x/y and returns z when x/y is a finite 277 // decimal. Otherwise it returns nil and the value of z is undefined. 278 // 279 // The scale of a non-nil result is "x.Scale() - y.Scale()" or greater; it is 280 // calculated so that the remainder will be zero whenever x/y is a finite 281 // decimal. 282 func (z *Dec) QuoExact(x, y *Dec) *Dec { 283 return z.quo(x, y, scaleQuoExact{}, RoundExact) 284 } 285 286 // quoRem sets z to the quotient x/y with the scale s, and if useRem is true, 287 // it sets remNum and remDen to the numerator and denominator of the remainder. 288 // It returns z, remNum and remDen. 289 // 290 // The remainder is normalized to the range -1 < r < 1 to simplify rounding; 291 // that is, the results satisfy the following equation: 292 // 293 // x / y = z + (remNum/remDen) * 10**(-z.Scale()) 294 // 295 // See Rounder for more details about rounding. 296 // 297 func (z *Dec) quoRem(x, y *Dec, s Scale, useRem bool, 298 remNum, remDen *big.Int) (*Dec, *big.Int, *big.Int) { 299 // difference (required adjustment) compared to "canonical" result scale 300 shift := s - (x.Scale() - y.Scale()) 301 // pointers to adjusted unscaled dividend and divisor 302 var ix, iy *big.Int 303 switch { 304 case shift > 0: 305 // increased scale: decimal-shift dividend left 306 ix = new(big.Int).Mul(x.UnscaledBig(), exp10(shift)) 307 iy = y.UnscaledBig() 308 case shift < 0: 309 // decreased scale: decimal-shift divisor left 310 ix = x.UnscaledBig() 311 iy = new(big.Int).Mul(y.UnscaledBig(), exp10(-shift)) 312 default: 313 ix = x.UnscaledBig() 314 iy = y.UnscaledBig() 315 } 316 // save a copy of iy in case it to be overwritten with the result 317 iy2 := iy 318 if iy == z.UnscaledBig() { 319 iy2 = new(big.Int).Set(iy) 320 } 321 // set scale 322 z.SetScale(s) 323 // set unscaled 324 if useRem { 325 // Int division 326 _, intr := z.UnscaledBig().QuoRem(ix, iy, new(big.Int)) 327 // set remainder 328 remNum.Set(intr) 329 remDen.Set(iy2) 330 } else { 331 z.UnscaledBig().Quo(ix, iy) 332 } 333 return z, remNum, remDen 334 } 335 336 type sclr struct{ s Scale } 337 338 func (s sclr) Scale(x, y *Dec) Scale { 339 return s.s 340 } 341 342 type scaleQuoExact struct{} 343 344 func (sqe scaleQuoExact) Scale(x, y *Dec) Scale { 345 rem := new(big.Rat).SetFrac(x.UnscaledBig(), y.UnscaledBig()) 346 f2, f5 := factor2(rem.Denom()), factor(rem.Denom(), bigInt[5]) 347 var f10 Scale 348 if f2 > f5 { 349 f10 = Scale(f2) 350 } else { 351 f10 = Scale(f5) 352 } 353 return x.Scale() - y.Scale() + f10 354 } 355 356 func factor(n *big.Int, p *big.Int) int { 357 // could be improved for large factors 358 d, f := n, 0 359 for { 360 dd, dm := new(big.Int).DivMod(d, p, new(big.Int)) 361 if dm.Sign() == 0 { 362 f++ 363 d = dd 364 } else { 365 break 366 } 367 } 368 return f 369 } 370 371 func factor2(n *big.Int) int { 372 // could be improved for large factors 373 f := 0 374 for ; n.Bit(f) == 0; f++ { 375 } 376 return f 377 } 378 379 func upscale(a, b *Dec) (*Dec, *Dec) { 380 if a.Scale() == b.Scale() { 381 return a, b 382 } 383 if a.Scale() > b.Scale() { 384 bb := b.rescale(a.Scale()) 385 return a, bb 386 } 387 aa := a.rescale(b.Scale()) 388 return aa, b 389 } 390 391 func exp10(x Scale) *big.Int { 392 if int(x) < len(exp10cache) { 393 return &exp10cache[int(x)] 394 } 395 return new(big.Int).Exp(bigInt[10], big.NewInt(int64(x)), nil) 396 } 397 398 func (x *Dec) rescale(newScale Scale) *Dec { 399 shift := newScale - x.Scale() 400 switch { 401 case shift < 0: 402 e := exp10(-shift) 403 return NewDecBig(new(big.Int).Quo(x.UnscaledBig(), e), newScale) 404 case shift > 0: 405 e := exp10(shift) 406 return NewDecBig(new(big.Int).Mul(x.UnscaledBig(), e), newScale) 407 } 408 return x 409 } 410 411 var zeros = []byte("00000000000000000000000000000000" + 412 "00000000000000000000000000000000") 413 var lzeros = Scale(len(zeros)) 414 415 func appendZeros(s []byte, n Scale) []byte { 416 for i := Scale(0); i < n; i += lzeros { 417 if n > i+lzeros { 418 s = append(s, zeros...) 419 } else { 420 s = append(s, zeros[0:n-i]...) 421 } 422 } 423 return s 424 } 425 426 func (x *Dec) String() string { 427 if x == nil { 428 return "<nil>" 429 } 430 scale := x.Scale() 431 s := []byte(x.UnscaledBig().String()) 432 if scale <= 0 { 433 if scale != 0 && x.unscaled.Sign() != 0 { 434 s = appendZeros(s, -scale) 435 } 436 return string(s) 437 } 438 negbit := Scale(-((x.Sign() - 1) / 2)) 439 // scale > 0 440 lens := Scale(len(s)) 441 if lens-negbit <= scale { 442 ss := make([]byte, 0, scale+2) 443 if negbit == 1 { 444 ss = append(ss, '-') 445 } 446 ss = append(ss, '0', '.') 447 ss = appendZeros(ss, scale-lens+negbit) 448 ss = append(ss, s[negbit:]...) 449 return string(ss) 450 } 451 // lens > scale 452 ss := make([]byte, 0, lens+1) 453 ss = append(ss, s[:lens-scale]...) 454 ss = append(ss, '.') 455 ss = append(ss, s[lens-scale:]...) 456 return string(ss) 457 } 458 459 // Format is a support routine for fmt.Formatter. It accepts the decimal 460 // formats 'd' and 'f', and handles both equivalently. 461 // Width, precision, flags and bases 2, 8, 16 are not supported. 462 func (x *Dec) Format(s fmt.State, ch rune) { 463 if ch != 'd' && ch != 'f' && ch != 'v' && ch != 's' { 464 fmt.Fprintf(s, "%%!%c(dec.Dec=%s)", ch, x.String()) 465 return 466 } 467 fmt.Fprintf(s, x.String()) 468 } 469 470 func (z *Dec) scan(r io.RuneScanner) (*Dec, error) { 471 unscaled := make([]byte, 0, 256) // collects chars of unscaled as bytes 472 dp, dg := -1, -1 // indexes of decimal point, first digit 473 loop: 474 for { 475 ch, _, err := r.ReadRune() 476 if err == io.EOF { 477 break loop 478 } 479 if err != nil { 480 return nil, err 481 } 482 switch { 483 case ch == '+' || ch == '-': 484 if len(unscaled) > 0 || dp >= 0 { // must be first character 485 r.UnreadRune() 486 break loop 487 } 488 case ch == '.': 489 if dp >= 0 { 490 r.UnreadRune() 491 break loop 492 } 493 dp = len(unscaled) 494 continue // don't add to unscaled 495 case ch >= '0' && ch <= '9': 496 if dg == -1 { 497 dg = len(unscaled) 498 } 499 default: 500 r.UnreadRune() 501 break loop 502 } 503 unscaled = append(unscaled, byte(ch)) 504 } 505 if dg == -1 { 506 return nil, fmt.Errorf("no digits read") 507 } 508 if dp >= 0 { 509 z.SetScale(Scale(len(unscaled) - dp)) 510 } else { 511 z.SetScale(0) 512 } 513 _, ok := z.UnscaledBig().SetString(string(unscaled), 10) 514 if !ok { 515 return nil, fmt.Errorf("invalid decimal: %s", string(unscaled)) 516 } 517 return z, nil 518 } 519 520 // SetString sets z to the value of s, interpreted as a decimal (base 10), 521 // and returns z and a boolean indicating success. The scale of z is the 522 // number of digits after the decimal point (including any trailing 0s), 523 // or 0 if there is no decimal point. If SetString fails, the value of z 524 // is undefined but the returned value is nil. 525 func (z *Dec) SetString(s string) (*Dec, bool) { 526 r := strings.NewReader(s) 527 _, err := z.scan(r) 528 if err != nil { 529 return nil, false 530 } 531 _, _, err = r.ReadRune() 532 if err != io.EOF { 533 return nil, false 534 } 535 // err == io.EOF => scan consumed all of s 536 return z, true 537 } 538 539 // Scan is a support routine for fmt.Scanner; it sets z to the value of 540 // the scanned number. It accepts the decimal formats 'd' and 'f', and 541 // handles both equivalently. Bases 2, 8, 16 are not supported. 542 // The scale of z is the number of digits after the decimal point 543 // (including any trailing 0s), or 0 if there is no decimal point. 544 func (z *Dec) Scan(s fmt.ScanState, ch rune) error { 545 if ch != 'd' && ch != 'f' && ch != 's' && ch != 'v' { 546 return fmt.Errorf("Dec.Scan: invalid verb '%c'", ch) 547 } 548 s.SkipSpace() 549 _, err := z.scan(s) 550 return err 551 } 552 553 // Gob encoding version 554 const decGobVersion byte = 1 555 556 func scaleBytes(s Scale) []byte { 557 buf := make([]byte, scaleSize) 558 i := scaleSize 559 for j := 0; j < scaleSize; j++ { 560 i-- 561 buf[i] = byte(s) 562 s >>= 8 563 } 564 return buf 565 } 566 567 func scale(b []byte) (s Scale) { 568 for j := 0; j < scaleSize; j++ { 569 s <<= 8 570 s |= Scale(b[j]) 571 } 572 return 573 } 574 575 // GobEncode implements the gob.GobEncoder interface. 576 func (x *Dec) GobEncode() ([]byte, error) { 577 buf, err := x.UnscaledBig().GobEncode() 578 if err != nil { 579 return nil, err 580 } 581 buf = append(append(buf, scaleBytes(x.Scale())...), decGobVersion) 582 return buf, nil 583 } 584 585 // GobDecode implements the gob.GobDecoder interface. 586 func (z *Dec) GobDecode(buf []byte) error { 587 if len(buf) == 0 { 588 return fmt.Errorf("Dec.GobDecode: no data") 589 } 590 b := buf[len(buf)-1] 591 if b != decGobVersion { 592 return fmt.Errorf("Dec.GobDecode: encoding version %d not supported", b) 593 } 594 l := len(buf) - scaleSize - 1 595 err := z.UnscaledBig().GobDecode(buf[:l]) 596 if err != nil { 597 return err 598 } 599 z.SetScale(scale(buf[l : l+scaleSize])) 600 return nil 601 } 602 603 // MarshalText implements the encoding.TextMarshaler interface. 604 func (x *Dec) MarshalText() ([]byte, error) { 605 return []byte(x.String()), nil 606 } 607 608 // UnmarshalText implements the encoding.TextUnmarshaler interface. 609 func (z *Dec) UnmarshalText(data []byte) error { 610 _, ok := z.SetString(string(data)) 611 if !ok { 612 return fmt.Errorf("invalid inf.Dec") 613 } 614 return nil 615 }