| // 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 | |
| } | |