こんにちは。Tomoyuki(@tomoyuki65)です。
Go言語(Golang)で数学計算(平方根・三角関数・指数・対数など)をする際は、「math」パッケージを使うことになります。
この記事では、そんな「math」パッケージについてまとめます。
Go言語(Golang)の数学計算で使うmathパッケージまとめ
まずGo言語(Golang)において通常の数学計算なら「math」パッケージを使うことになりますが、これはfloat64型の精度(約15桁)で計算処理をするため、もしそれ以上の精度が必要な場合は「math/big」パッケージの任意精度型を使う必要があるので注意しましょう。
例えば暗号や金融関係などで大きな数値を扱ったり、精密計算が要求されるような場合は、「math/big」パッケージを使う必要があります。
ただし、「math/big」パッケージはソフトウェアで任意桁計算しており、桁数が増えるほど計算速度が遅くなるので注意が必要です。
そのため、速度重視なら「math」パッケージを使う必要があり、精度重視なら「math/big」パッケージを使う必要があるため、どちらを使うべきかはしっかり判断するのが大事です。
「math」パッケージの使用例
例えば「math」パッケージを利用して、平方根やべき乗の計算をする例としては以下のようになります。
package main
import (
"fmt"
"math"
)
func main() {
/*********************
* 平方根の計算
*********************/
// 整数の16を明示的にfloat64型で設定
x := float64(16)
// √16を計算
sqrtX := math.Sqrt(x)
// ログ出力
fmt.Printf("√%.0f = %.0f\n", x, sqrtX)
/*********************
* べき乗の計算
*********************/
// 底として整数の2を明示的にfloat64型で設定
base := float64(2)
// 指数として整数の3を明示的にfloat64型で設定
exponent := float64(3)
// 2の3乗を計算
power := math.Pow(base, exponent)
// ログ出力
fmt.Printf("%.0f^%.0f = %.0f\n", base, exponent, power)
}
実行結果
√16 = 4
2^3 = 8
「math/big」パッケージの使用例
次に上記と同様の計算を「math/big」パッケージを利用して実現させようとした場合は以下のようになります。
package main
import (
"fmt"
"math/big"
)
func main() {
/**************************
* 計算精度の設定(ビット単位)
**************************/
prec := uint(200)
/*********************
* 平方根の計算
*********************/
// 整数の16をbig.Float型を使って設定
x := new(big.Float).SetPrec(prec).SetFloat64(16)
// √16を計算
sqrtX := new(big.Float).SetPrec(prec).Sqrt(x)
// ログ出力
fmt.Printf("√%s = %s\n", x.Text('f', 0), sqrtX.Text('f', 0))
/*********************
* べき乗の計算
*********************/
// 底として整数の2をbig.Float型を使って設定
base := new(big.Float).SetPrec(prec).SetFloat64(2)
// 指数として整数の3を設定
exponent := 3
// べき乗の計算処理(初期値1からループ処理で計算)
power := new(big.Float).SetPrec(prec).SetFloat64(1)
for i := 0; i < exponent; i++ {
// power × baseを計算
power.Mul(power, base)
}
// ログ出力
fmt.Printf("%s^%d = %s\n", base.Text('f', 0), exponent, power.Text('f', 0))
}
※べき乗の計算については、便利な関数などはないため、ループ処理などで計算する必要があります。
実行結果
√16 = 4
2^3 = 8
「math」パッケージの主要な関数まとめ
| 関数 | 説明 |
|---|---|
| Abs(x float64) float64 | x の絶対値を返す |
| Ceil(x float64) float64 | x 以上の最小の整数を返す(切り上げ) |
| Floor(x float64) float64 | x 以下の最大の整数を返す(切り捨て) |
| Round(x float64) float64 | x を最も近い整数に丸める |
| Pow(x, y float64) float64 | x の y 乗を返す |
| Sqrt(x float64) float64 | x の平方根を返す |
| Exp(x float64) float64 | e の x 乗を返す |
| Log(x float64) float64 | x の自然対数(底 e)を返す |
| Log10(x float64) float64 | x の常用対数(底 10)を返す |
| Sin(x float64) float64 | x の正弦を返す(ラジアン単位) |
| Cos(x float64) float64 | x の余弦を返す(ラジアン単位) |
| Tan(x float64) float64 | x の正接を返す(ラジアン単位) |
| Asin(x float64) float64 | x の逆正弦を返す(ラジアン単位) |
| Acos(x float64) float64 | x の逆余弦を返す(ラジアン単位) |
| Atan(x float64) float64 | x の逆正接を返す(ラジアン単位) |
| Max(x, y float64) float64 | x と y の大きい方を返す |
| Min(x, y float64) float64 | x と y の小さい方を返す |
| Hypot(p, q float64) float64 | √(p² + q²) を返す |
| Mod(x, y float64) float64 | x を y で割った余りを返す |
| RoundToEven(x float64) float64 | 最も近い偶数の整数に丸める |
「math」パッケージの主要な定数まとめ
| 定数名 | 説明 |
|---|---|
| Pi | 円周率 π ≈ 3.141592653589793 |
| E | 自然対数の底 e ≈ 2.718281828459045 |
| Phi | 黄金比 φ ≈ 1.618033988749895 |
| Sqrt2 | 平方根 2 ≈ 1.4142135623730951 |
| Ln2 | 自然対数の 2 ≈ 0.6931471805599453 |
| Ln10 | 自然対数の 10 ≈ 2.302585092994046 |
| Log2E | 底 2 の e の対数 ≈ 1.4426950408889634 |
| Log10E | 底 10 の e の対数 ≈ 0.4342944819032518 |
| SqrtE | 平方根 e ≈ 1.6487212707001282 |
| SqrtPi | 平方根 π ≈ 1.772453850905516 |
| Tau | 円周率の2倍 ≈ 6.283185307179586 |
※定数はfloat64型で定義されています。
「math/big」パッケージの主要なメソッドまとめ
| メソッド | 説明 |
|---|---|
| NewFloat | 新しい big.Float 値を作成する。例: big.NewFloat(3.14) |
| Set | 別の big.Float の値をコピーして設定する。 |
| SetFloat64 | float64 値を設定する。 |
| SetInt | big.Int の値を設定する。 |
| SetString | 文字列から値を設定する。成功時は true を返す。 |
| Float64 | float64 型に変換する(精度に注意)。 |
| Int | 整数部分を big.Int に変換する(切り捨て)。 |
| Add | 2つの big.Float を加算する。 |
| Sub | 2つの big.Float を減算する。 |
| Mul | 2つの big.Float を乗算する。 |
| Quo | 2つの big.Float を除算する。 |
| Neg | 値の符号を反転する。 |
| Abs | 値の絶対値を返す。 |
| Sqrt | 平方根を計算する。例: z.Sqrt(x) は z = √x を計算 |
| Cmp | 2つの big.Float を比較する。-1, 0, 1 を返す。 |
| Sign | 値の符号を返す。-1, 0, 1 |
| Prec | 現在の精度(ビット単位)を取得する。 |
| SetPrec | 精度(ビット単位)を設定する。 |
| Mode | 丸めモードを取得する。 |
| SetMode | 丸めモードを設定する。 |
| Text | 文字列に変換する。フォーマットや基数を指定可能。 |
| Append | 文字列に値を追加する(Text と同様)。 |
※計算処理をする際は精度の設定に注意して下さい。
「math/big」パッケージで使える型まとめ
| 型 | 用途 | 特徴 |
|---|---|---|
| big.Int | 任意精度整数 | 整数計算のみ。Goのintやint64の範囲を超えた整数も扱える。 |
| big.Rat | 有理数(分数) | 正確な割り算が可能。分母と分子を整数で保持するので誤差なし。 |
| big.Float | 高精度浮動小数点数 | 精度を指定可能。float64では表せない桁数でも計算可能。 |
その他の「math/⚪︎⚪︎」パッケージについて
| パッケージ名 | 簡単な説明 |
|---|---|
| math/cmplx | 複素数の計算用関数を提供(複素数の絶対値、偏角、指数など)。 |
| math/rand | 疑似乱数生成を提供(整数、浮動小数点数、シード指定など)。 |
| math/bits | 整数のビット操作(ビットカウント、反転、回転など)を提供。 |
※使用する際は型に注意。またmath/randは暗号などのセキュリティに関わるものに使うべきではないので注意。
最後に
今回は「math」パッケージについてまとめました。
Go言語(Golang)で数学計算をする際は「math」パッケージを利用することになりますが、精度によっては「math/big」パッケージを使う必要があるため、どちらを使うべきかはしっかり判断しましょう。



コメント