値が0からどれだけ離れているかの距離を表す絶対値は、GoではmathパッケージのAbs関数で求めることができます。
絶対値は数学では複素数における計算等に使われますが、Goにおいても計算は出来るものの少し注意が必要な点もあります。
本記事では、Goにおける絶対値の求め方と注意点について解説します。
記事内に記載しているプログラムは、Go1.15.2を使って動作確認をしています。
Goの絶対値(abs)の計算方法と注意点
Goの絶対値(abs)の計算方法と注意点について、以下の内容を解説します。
- 絶対値とは
- mathパッケージによる絶対値の計算方法と注意点
- math/bigパッケージによる絶対値の計算方法
- math/cmplxパッケージによる絶対値の計算方法
絶対値とは
絶対値とは、値の符号を無視して得られる正の値で、0から距離を表します。
数学では、|2| や |-2| という形で表現し、両者の結果はどちらも2です。
Goではこの絶対値の計算を、mathパッケージのAbs関数で行うことができます。
通常の絶対値計算であればこれで十分ですが、Goではmath/bigパッケージとmath/cmplxパッケージにも絶対値を計算するAbs関数が提供されていますので、これらも合わせて紹介します。
また、それぞれ利用する際にはimportが必要になります。
import ( "math" "math/big" "math/cmplx" )
mathパッケージによる絶対値の計算方法と注意点
mathパッケージのAbs関数は、float64型の絶対値を計算します。
整数を指定した場合は、整数で計算結果を返します。
result := math.Abs(3) fmt.Println(result) // -> 3 result = math.Abs(-3) fmt.Println(result) // -> 3
実数を指定した場合は、実数で計算結果を返します。
result = math.Abs(3.33) fmt.Println(result) // -> 3.33 result = math.Abs(-3.33) fmt.Println(result) // -> 3.33
特殊な場合として、正または負の無限大が指定された場合は、正の無限大を返します。
また、NaNが指定された場合は、NaNを返します。
result = math.Abs(math.Inf(1)) fmt.Println(result) // -> +Inf result = math.Abs(math.Inf(-1)) fmt.Println(result) // -> +Inf result = math.Abs(math.NaN()) fmt.Println(result) // -> NaN
mathパッケージのAbs関数で注意したいのは、float64を超える範囲の数値に対して計算を行うと丸めが発生する点です。
例えば、10÷3を計算すると丸めが発生して以下のようになります。
result = math.Abs(10.0 / 3.0) fmt.Println(result) // -> 3.3333333333333335
上記の計算はどこまでも続くのですが、終わりがあるint64の最大値や最小値でも以下のように途中で切られてしまいます。
(int64の最大値は9223372036854775807、最小値は-9223372036854775808です)
result = math.Abs(math.MinInt64) fmt.Println(result) // -> 9.223372036854776e+18 result = math.Abs(math.MaxInt64) fmt.Println(result) // -> 9.223372036854776e+18
上記のような場合は、math/bigパッケージを使うとより大きな数値を扱うことができるようになります。
math/bigパッケージによる絶対値の計算方法
先程のint64の最大値と最小値をmath/bigパッケージを使うと以下のようになります。
b := big.NewInt(math.MinInt64) r := b.Abs(b) fmt.Println(r) // -> 9223372036854775808 b = big.NewInt(math.MaxInt64) r = b.Abs(b) fmt.Println(r) // -> 9223372036854775807
今度は途中で切られることなく計算することができました。
math/cmplxパッケージによる絶対値の計算方法
Goでは、複素数の計算に関する関数をmath/cmplxパッケージで提供しています。
絶対値に関する計算も行うことができます。
c := cmplx.Abs(3 + 4i) fmt.Println(c) // -> 5
絶対値は0から距離なので、ピタゴラスの定理による計算で求める値となります。
まとめ
Goの絶対値(abs)の計算方法と注意点についてまとめると、以下となります。
- Goで絶対値を計算するには、mathパッケージのAbs関数を使う。
- 計算する数値の桁が大きい場合には、math/bigパッケージのAbs関数を使う。
- 複素数による絶対値の計算を行う場合には、math/cmplxパッケージのAbs関数を使う。
あまり使う機会多くない関数であるとは思いますが、いつでも使えるように注意点を知っておくことは重要となります。
今回は、Goの絶対値(abs)の計算方法と注意点について解説しました。
以上、参考になれば幸いです。
コメント