たとえば特殊関数

数値計算をしようとすると時には特殊関数を扱う必要が出てきます。たとえばガンマ関数、しかも複素数版。フォートランならばCERNLibにCGAMMAなんてものもあって、便利だったわけです。

昨今、システムが肥大化するのもそうなんですが、やはりコードの開発しやすさからいくとC++で作りたくなってきます。一方で上記特殊関数を網羅する計算ライブラリがあるようでないようで、良く分からない。結局簡単なものは作ってしまったり、どっかにあるのを使わせていただいたりということになるのも致し方ないかとおもうわけです。

一方、数値計算のアルゴリズムはフォートランベースで開発された由緒正しいものがあふれていたりするのですが、時々みかけるC++バージョンというのはf2cとおしただけじゃないの?って感じのものが多数。それで動いていればいいのですが、f77とC++の方言の違いがかならずしも吸収されるわけではなく、問題ありってのもやっぱりあるように思えます。

そのうちの1例になりますが、C++バージョンの複素数ガンマ関数。とある実装は、それもとあるフォートランの焼き直し。あまりに焼き直しに忠実になってんだが、なってないんだか分からないのですが、変数宣言で初期値指定がなされていません。まあ通常はそのまま使うことってなくて、なんらかの演算結果を代入していくのですが、今回見たコードはどうも初期値0.0を期待して出来ているルーチン。案の定想定外の動作をするわけです。

実のところ、これはなかなか怖い状況であるわけで、逆にライブラリ化されてしまうとそういう問題はなかなか表面化してこないので、単体の関数ベースでソースレベルの公開がされていれば、そこだけもってきて、気に入らなければ書き直して使えばよいのではありますが。。。。コンパイラの動作をちゃんと知っていないと嵌る問題って潜在的に大きくなっていきますよね。フォートランからの直接的な翻訳では。。。。。

どこまでを自分でチェックできるかってのはかなり難しい問題ですが。