Goの絶対値(abs)の計算方法と注意点

プログラミング

値が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)の計算方法と注意点について解説しました。

以上、参考になれば幸いです。

コメント

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