複素数の型名に関する表記ゆれ
浮動小数点はIEEE754で定められたビット数があり,浮動小数点の型名はFloat32(Float),Float64(Double)のようにビット数を明示的に示すことが多い.
複素数型の多くはジェネリクスで定義され,浮動小数点のペアを持つ.
その場合,型名につけるビット数は単一の要素かペアの総数のどちらが適切かという話.
もちろんもっと適切な書式があれば知りたい.
go, pythonでは float32
を2つ格納したものを complex64
, float64
を2つ格納したものを complex128
型とする.※1, ※2
rustでは f32
を2つ格納したものを complex32
,f64
を2つ格納したものを complex64
としている.
この場合,complex64
という型は go, numpy では float32
のペア,rust では float64
のペアとなり,解釈に違いが生まれてしまう.
表記的にどちらが正しいのだろうか.もしくは適切なのだろうか.
前者はcomplex型全体のビット数を示そうとし,
後者は実部・虚部それぞれのビット数を示している.
科学技術計算・数値計算を書く身としては,rust(後者)のように実際に計算をさせる実部・虚部それぞれのビット数を示してくれた方がわかりやすい.
一方でプリミティブなデータ型として見ると,goやnumpy(前者)のように型全体のビット数を表記する方が他のプリミティブ型と一貫性があると思う.
どちらの書式でも意図したいことはわかる.ただ混乱のもとなので統一してほしい.
型のビット数に起因する問題はFPUを使うかバイナリ形式の配列を読む場合に発現する.
すなわち機械語に翻訳されて実行されるプログラミング言語か,科学技術計算の文脈で用いられるプログラミング言語で問題となりやすい.
そのうち比較的モダンな言語で,ビット数ごとに複素数の型名を定義しているものはgo, rust, pythonあたりだったので比較した.
他に複素数型を扱い機械語に訳されるプログラミング言語としてc++(<complex>)やswift(swift-numerics)が挙げられるが,それぞれテンプレート・ジェネリクスで実装しており,格納する数値のビット数ごとに型名を与えていない.
複数のプリミティブな値を持つ型というとsimdレジスタ型がある.
simdレジスタ型では個々の要素のビット数ではなく総ビット数をsuffixとしているので,そちらに合わせるべきか.