記録できる数値の桁数に制限を設けない変数をプログラマーに提供するBigInt/BigFloat。以前使った時 は確率計算の一環だったのですが、今取り組んでいる別ネタもまたもや確率でBigFloatのお世話になろうとしています。
別ネタの内容は後日書くとして検索中に見つけたこの質問 、最後の方にBigIntを引数にsin関数を呼ぼうとするとエラーになるとあります。どうやらBigInt/BigFloatを引数にするsin関数が見つからないようなのですが、多分それ存在しないと思う。
BigInt/BigFloatの目的は前述のように記録できる桁数に糸目をつけず丸め誤差を生じさせないこと。となると、それを引数にしてBigFloatで返す関数も(ユーザーが承知しない限り)同じく桁数に糸目をつけてはいけない。おそらくsin(2.0)は無限に続く小数となると思われるので返しようがない。こんな例がゴマンと存在する三角関数は提供不可能になる。同様の理由でexp()、log()、pow()などもダメでしょうねぇ。
三角関数に関しては無限級数による近似式 がありますので、欲しい精度まで級数の項数を増やして対応するという手があります。次数を増やすと重そうですが、sin(100π)なんてx=0から遠いところに対応しようとすると増やさざるを得ない。sin(x+2nπ)=sin xを使ってx=0に近づけたいですが、BigFloatでπを正確に記述できないので誤差が出てしまう。
こう考えるとBigFloatって天文学など科学技術計算ではかなり使いにくい。.NET FrameworkでもBigInteger は提供されているけど、BigFloatに相当するものが見当たらないのってこういう理由でしょうか。
[2013/8/13 追記] PerlのMath::BigFloatは有効数字を引数に与えることで三角関数が存在するみたいです。Math::BigFloat (Perldoc)
Comments