自分でGo関連の情報を収集してたら、Goだと複素数が組み込みで入ってるらしいので、触ってみることにした。
やること
シンプルに複素数の積と偏角の和の性質を確かめる。
その過程で使える便利関数を探してみる。
角度計算をしてみたコード
package main
import (
"fmt"
"math"
)
func main() {
const X complex128 = complex(1,1)
ratio := real(X)/imag(X) // 実部と虚部を取り出して比を計算
const radian := math.Atan(ratio) // 比からタンジェントの逆関数で偏角を計算
fmt.Println(radian * 180 / math.Pi) // ラジアンから度数に変換 45度になる
}
複素数型である complex128 を宣言して、
real関数: 実部を取得
imag関数: 虚部を取得
と、組み込み関数で簡単に取り出せるのはすごく楽
ただ、探した感じラジアンを度数法に変換する組み込み関数は見つからなかったので、そこは自分で実装してみた。
複素数の積を計算してみたコード
package main
import (
"fmt"
"math/cmplx"
"math"
)
func main() {
const X complex128 = complex(1,1)
const Y complex128 = complex(2,2)
const multi = X * Y // 乗算
_, theta := cmplx.Polar(multi) //極座標の形で距離と偏角を返す
fmt.Println(theta * 180 / math.Pi) // ラジアンから度数に変換 90度になる
}
二つの複素数の積は二つの複素数の偏角の和となるかをさくっと検証してみたコード。
今回の乗算結果の複素数は90度になるので、普通にタンジェントだと計算できない(0除算できない)が、
cmplx.Polarで極座標の形で返した場合はちゃんと90度が返ってきた
極座標変換を実装するのは面倒臭いので、組み込み関数で行えるのは本当にありがたい。
複素数の感想
上記の複素数計算パッケージを見る限り、一通りの計算方法が実装されていて、複素数の性質とGoのドキュメントがよめれば結構有用だと思う。
そのほかにも、単純計算パッケージである、
にも三角関数やπなどの無理数が定数として入っていて非常に使いやすかった。
さいごに
始めてGoを触ったのですが、オブジェクト指向に慣れ親しんだ人だと結構面を食らいます。
複素数型が入っているのに、計算を行う関数は複素数型に生えておらず全く別の関数として存在しているという点からも、Goの思想がにじみ出ていると感じました。
個人的には、複数の返り値の受け取り方や、組み込み関数の形的に静的型チェックを追加したpythonにC++を混ぜて、オブジェクト指向を削ったような印象です。
ただ、静的型チェックなども含めて非常にシンプル且つ安全なコードを書きやすいと感じました。
それではよきGoライフを