// Copyright 2015 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. package big_test import ( "fmt" "math/big" ) // Use the classic continued fraction for e // // e = [1; 0, 1, 1, 2, 1, 1, ... 2n, 1, 1, ...] // // i.e., for the nth term, use // // 1 if n mod 3 != 1 // (n-1)/3 * 2 if n mod 3 == 1 func recur(n, lim int64) *big.Rat { term := new(big.Rat) if n%3 != 1 { term.SetInt64(1) } else { term.SetInt64((n - 1) / 3 * 2) } if n > lim { return term } // Directly initialize frac as the fractional // inverse of the result of recur. frac := new(big.Rat).Inv(recur(n+1, lim)) return term.Add(term, frac) } // This example demonstrates how to use big.Rat to compute the // first 15 terms in the sequence of rational convergents for // the constant e (base of natural logarithm). func Example_eConvergents() { for i := 1; i <= 15; i++ { r := recur(0, int64(i)) // Print r both as a fraction and as a floating-point number. // Since big.Rat implements fmt.Formatter, we can use %-13s to // get a left-aligned string representation of the fraction. fmt.Printf("%-13s = %s\n", r, r.FloatString(8)) } // Output: // 2/1 = 2.00000000 // 3/1 = 3.00000000 // 8/3 = 2.66666667 // 11/4 = 2.75000000 // 19/7 = 2.71428571 // 87/32 = 2.71875000 // 106/39 = 2.71794872 // 193/71 = 2.71830986 // 1264/465 = 2.71827957 // 1457/536 = 2.71828358 // 2721/1001 = 2.71828172 // 23225/8544 = 2.71828184 // 25946/9545 = 2.71828182 // 49171/18089 = 2.71828183 // 517656/190435 = 2.71828183 }