1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // Copyright 2009 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- //go:build ignore
- // +build ignore
- package main
- import (
- big "."
- "fmt"
- "runtime"
- )
- var (
- tmp1 = big.NewInt(0)
- tmp2 = big.NewInt(0)
- numer = big.NewInt(1)
- accum = big.NewInt(0)
- denom = big.NewInt(1)
- ten = big.NewInt(10)
- )
- func extractDigit() int64 {
- if big.CmpInt(numer, accum) > 0 {
- return -1
- }
- tmp1.Lsh(numer, 1).Add(tmp1, numer).Add(tmp1, accum)
- big.DivModInt(tmp1, tmp2, tmp1, denom)
- tmp2.Add(tmp2, numer)
- if big.CmpInt(tmp2, denom) >= 0 {
- return -1
- }
- return tmp1.Int64()
- }
- func nextTerm(k int64) {
- y2 := k*2 + 1
- accum.Add(accum, tmp1.Lsh(numer, 1))
- accum.Mul(accum, tmp1.SetInt64(y2))
- numer.Mul(numer, tmp1.SetInt64(k))
- denom.Mul(denom, tmp1.SetInt64(y2))
- }
- func eliminateDigit(d int64) {
- accum.Sub(accum, tmp1.Mul(denom, tmp1.SetInt64(d)))
- accum.Mul(accum, ten)
- numer.Mul(numer, ten)
- }
- func main() {
- i := 0
- k := int64(0)
- for {
- d := int64(-1)
- for d < 0 {
- k++
- nextTerm(k)
- d = extractDigit()
- }
- eliminateDigit(d)
- fmt.Printf("%c", d+'0')
- if i++; i%50 == 0 {
- fmt.Printf("\n")
- if i >= 1000 {
- break
- }
- }
- }
- fmt.Printf("\n%d calls; bit sizes: %d %d %d\n", runtime.NumCgoCall(), numer.Len(), accum.Len(), denom.Len())
- }
|