github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/math/big/doc.go (about) 1 // Copyright 2009 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 /* 6 bigパッケージは任意精度算術(大きな数)を実装します。 7 以下の数値型がサポートされています: 8 9 Int 符号付き整数 10 Rat 有理数 11 Float 浮動小数点数 12 13 [Int]、[Rat]、または [Float] のゼロ値は0に対応します。したがって、新しい 14 値は通常の方法で宣言でき、さらなる初期化なしで0を示します: 15 16 var x Int // &xは値0の*Intです 17 var r = &Rat{} // rは値0の*Ratです 18 y := new(Float) // yは値0の*Floatです 19 20 あるいは、新しい値は以下の形式のファクトリ関数で割り当てて初期化することができます: 21 22 func NewT(v V) *T 23 24 例えば、[NewInt](x)はint64引数xの値に設定された*[Int] を返し、 25 [NewRat](a, b)はaとbがint64値である分数a/bに設定された*[Rat] を返し、 26 [NewFloat](f)はfloat64引数fに初期化された*[Float] を返します。 27 より柔軟性を提供するために、明示的なセッターが提供されています。例えば: 28 29 var z1 Int 30 z1.SetUint64(123) // z1 := 123 31 z2 := new(Rat).SetFloat64(1.25) // z2 := 5/4 32 z3 := new(Float).SetInt(z1) // z3 := 123.0 33 34 セッター、数値演算、および述語は、以下の形式のメソッドとして表現されます: 35 36 func (z *T) SetV(v V) *T // z = v 37 func (z *T) Unary(x *T) *T // z = unary x 38 func (z *T) Binary(x, y *T) *T // z = x binary y 39 func (x *T) Pred() P // p = pred(x) 40 41 Tは [Int]、[Rat]、または [Float] のいずれかです。単項および二項演算の場合、 42 結果はレシーバ(通常その場合はzと名付けられます。以下参照)であり、 43 それがオペランドxまたはyのいずれかであれば、安全に上書き(およびそのメモリの再利用)が可能です。 44 45 算術式は通常、個々のメソッド呼び出しのシーケンスとして書かれ、 46 各呼び出しが操作に対応します。レシーバは結果を示し、 47 メソッドの引数は操作のオペランドです。 48 例えば、*Int値a、b、cが与えられた場合、次の呼び出し 49 50 c.Add(a, b) 51 52 これは、a + bの和を計算し、結果をcに格納します。これにより、 53 以前にcに格納されていた値は上書きされます。特に指定がない限り、 54 操作はパラメータのエイリアシングを許可するため、次のように書いても問題ありません。 55 56 sum.Add(sum, x) 57 58 これにより、値xがsumに累積されます。 59 60 (常にレシーバ経由で結果値を渡すことにより、メモリの使用を 61 はるかによく制御できます。各結果に新たにメモリを割り当てる代わりに、 62 操作は結果値に割り当てられたスペースを再利用し、 63 そのプロセスで新しい結果でその値を上書きすることができます。) 64 65 表記法の規則:APIで一貫して名前が付けられている入力メソッドパラメータ(レシーバを含む) 66 は、その使用法を明確にするためです。入力オペランドは通常、x、y、a、bなどと名付けられますが、 67 zとは名付けられません。結果を指定するパラメータはzと名付けられます(通常はレシーバ)。 68 69 例えば、(*Int).Addの引数はxとyと名付けられています。 70 そして、レシーバが結果の格納先を指定するため、それはzと呼ばれます: 71 72 func (z *Int) Add(x, y *Int) *Int 73 74 この形式のメソッドは、単純な呼び出しチェーンを可能にするため、通常、受け取ったレシーバも返します。 75 76 結果値を渡す必要がないメソッド(例えば、[Int.Sign])は、単に結果を返します。 77 この場合、レシーバは通常、最初のオペランドで、xと名付けられます: 78 79 func (x *Int) Sign() int 80 81 さまざまなメソッドが文字列と対応する数値との間の変換をサポートしており、その逆も可能です: 82 *[Int]、*[Rat]、および*[Float] の値は、値の(デフォルトの)文字列表現のためのStringerインターフェースを実装しますが、 83 また、さまざまなサポートされている形式で文字列から値を初期化するためのSetStringメソッドも提供します 84 (それぞれのSetStringのドキュメンテーションを参照してください)。 85 86 最後に、*[Int]、*[Rat]、および*[Float] は、スキャンのための [fmt.Scanner] を満たし、 87 (*Ratを除いて)フォーマットされた印刷のためのFormatterインターフェースを満たします。 88 */ 89 package big