PR

Go言語(Golang)の数学計算で使うmathパッケージまとめ

2. 基礎

こんにちは。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」パッケージを使う必要があるため、どちらを使うべきかはしっかり判断しましょう。

 

コメント

タイトルとURLをコピーしました