1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package big_test 6 7 import ( 8 "fmt" 9 "math/big" 10 ) 11 12 // Use the classic continued fraction for e 13 // 14 // e = [1; 0, 1, 1, 2, 1, 1, ... 2n, 1, 1, ...] 15 // 16 // i.e., for the nth term, use 17 // 18 // 1 if n mod 3 != 1 19 // (n-1)/3 * 2 if n mod 3 == 1 20 func recur(n, lim int64) *big.Rat { 21 term := new(big.Rat) 22 if n%3 != 1 { 23 term.SetInt64(1) 24 } else { 25 term.SetInt64((n - 1) / 3 * 2) 26 } 27 28 if n > lim { 29 return term 30 } 31 32 // Directly initialize frac as the fractional 33 // inverse of the result of recur. 34 frac := new(big.Rat).Inv(recur(n+1, lim)) 35 36 return term.Add(term, frac) 37 } 38 39 // This example demonstrates how to use big.Rat to compute the 40 // first 15 terms in the sequence of rational convergents for 41 // the constant e (base of natural logarithm). 42 func Example_eConvergents() { 43 for i := 1; i <= 15; i++ { 44 r := recur(0, int64(i)) 45 46 // Print r both as a fraction and as a floating-point number. 47 // Since big.Rat implements fmt.Formatter, we can use %-13s to 48 // get a left-aligned string representation of the fraction. 49 fmt.Printf("%-13s = %s\n", r, r.FloatString(8)) 50 } 51 52 // Output: 53 // 2/1 = 2.00000000 54 // 3/1 = 3.00000000 55 // 8/3 = 2.66666667 56 // 11/4 = 2.75000000 57 // 19/7 = 2.71428571 58 // 87/32 = 2.71875000 59 // 106/39 = 2.71794872 60 // 193/71 = 2.71830986 61 // 1264/465 = 2.71827957 62 // 1457/536 = 2.71828358 63 // 2721/1001 = 2.71828172 64 // 23225/8544 = 2.71828184 65 // 25946/9545 = 2.71828182 66 // 49171/18089 = 2.71828183 67 // 517656/190435 = 2.71828183 68 } 69