github.com/flyinox/gosm@v0.0.0-20171117061539-16768cb62077/src/math/big/example_test.go (about) 1 // Copyright 2012 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 "log" 10 "math" 11 "math/big" 12 ) 13 14 func ExampleRat_SetString() { 15 r := new(big.Rat) 16 r.SetString("355/113") 17 fmt.Println(r.FloatString(3)) 18 // Output: 3.142 19 } 20 21 func ExampleInt_SetString() { 22 i := new(big.Int) 23 i.SetString("644", 8) // octal 24 fmt.Println(i) 25 // Output: 420 26 } 27 28 func ExampleRat_Scan() { 29 // The Scan function is rarely used directly; 30 // the fmt package recognizes it as an implementation of fmt.Scanner. 31 r := new(big.Rat) 32 _, err := fmt.Sscan("1.5000", r) 33 if err != nil { 34 log.Println("error scanning value:", err) 35 } else { 36 fmt.Println(r) 37 } 38 // Output: 3/2 39 } 40 41 func ExampleInt_Scan() { 42 // The Scan function is rarely used directly; 43 // the fmt package recognizes it as an implementation of fmt.Scanner. 44 i := new(big.Int) 45 _, err := fmt.Sscan("18446744073709551617", i) 46 if err != nil { 47 log.Println("error scanning value:", err) 48 } else { 49 fmt.Println(i) 50 } 51 // Output: 18446744073709551617 52 } 53 54 func ExampleFloat_Scan() { 55 // The Scan function is rarely used directly; 56 // the fmt package recognizes it as an implementation of fmt.Scanner. 57 f := new(big.Float) 58 _, err := fmt.Sscan("1.19282e99", f) 59 if err != nil { 60 log.Println("error scanning value:", err) 61 } else { 62 fmt.Println(f) 63 } 64 // Output: 1.19282e+99 65 } 66 67 // This example demonstrates how to use big.Int to compute the smallest 68 // Fibonacci number with 100 decimal digits and to test whether it is prime. 69 func Example_fibonacci() { 70 // Initialize two big ints with the first two numbers in the sequence. 71 a := big.NewInt(0) 72 b := big.NewInt(1) 73 74 // Initialize limit as 10^99, the smallest integer with 100 digits. 75 var limit big.Int 76 limit.Exp(big.NewInt(10), big.NewInt(99), nil) 77 78 // Loop while a is smaller than 1e100. 79 for a.Cmp(&limit) < 0 { 80 // Compute the next Fibonacci number, storing it in a. 81 a.Add(a, b) 82 // Swap a and b so that b is the next number in the sequence. 83 a, b = b, a 84 } 85 fmt.Println(a) // 100-digit Fibonacci number 86 87 // Test a for primality. 88 // (ProbablyPrimes' argument sets the number of Miller-Rabin 89 // rounds to be performed. 20 is a good value.) 90 fmt.Println(a.ProbablyPrime(20)) 91 92 // Output: 93 // 1344719667586153181419716641724567886890850696275767987106294472017884974410332069524504824747437757 94 // false 95 } 96 97 // This example shows how to use big.Float to compute the square root of 2 with 98 // a precision of 200 bits, and how to print the result as a decimal number. 99 func Example_sqrt2() { 100 // We'll do computations with 200 bits of precision in the mantissa. 101 const prec = 200 102 103 // Compute the square root of 2 using Newton's Method. We start with 104 // an initial estimate for sqrt(2), and then iterate: 105 // x_{n+1} = 1/2 * ( x_n + (2.0 / x_n) ) 106 107 // Since Newton's Method doubles the number of correct digits at each 108 // iteration, we need at least log_2(prec) steps. 109 steps := int(math.Log2(prec)) 110 111 // Initialize values we need for the computation. 112 two := new(big.Float).SetPrec(prec).SetInt64(2) 113 half := new(big.Float).SetPrec(prec).SetFloat64(0.5) 114 115 // Use 1 as the initial estimate. 116 x := new(big.Float).SetPrec(prec).SetInt64(1) 117 118 // We use t as a temporary variable. There's no need to set its precision 119 // since big.Float values with unset (== 0) precision automatically assume 120 // the largest precision of the arguments when used as the result (receiver) 121 // of a big.Float operation. 122 t := new(big.Float) 123 124 // Iterate. 125 for i := 0; i <= steps; i++ { 126 t.Quo(two, x) // t = 2.0 / x_n 127 t.Add(x, t) // t = x_n + (2.0 / x_n) 128 x.Mul(half, t) // x_{n+1} = 0.5 * t 129 } 130 131 // We can use the usual fmt.Printf verbs since big.Float implements fmt.Formatter 132 fmt.Printf("sqrt(2) = %.50f\n", x) 133 134 // Print the error between 2 and x*x. 135 t.Mul(x, x) // t = x*x 136 fmt.Printf("error = %e\n", t.Sub(two, t)) 137 138 // Output: 139 // sqrt(2) = 1.41421356237309504880168872420969807856967187537695 140 // error = 0.000000e+00 141 }