Project Eulerの26をJuliaでやってみた後に、BigFloatで検算しようとして初歩的なところで躓いたメモ。
要約?
precision $\neq$ accuracy
というだけの話ではあります。
(昔先輩にさんざん「混同するな」って注意されたなー)
本文
setprecision(1000)
BigFloat(1.0)/983.0
でこうなるわけですが、
0.00101729399796541200406917599186164801627670396744659206510681586978\
6368260427263479145473041709053916581892166836215666327568667344862665\
3102746693794506612410986775178026449643947100712105798575788402848423\
1943031536113936927772126144455747711088504577822990844354018311291963\
377416073245167853509664295
数えてみると小数点以下が305桁しか無いし、正しいはずの答えは以下、
...50966429_29806714...
と続くはずなので、最後の桁は四捨五入にもなってない。
なんで?と思ったんですが、setprecision
はその桁までの精度を保証するんではなく、単純に計算に使う桁数の指定のようです。
じゃあ、精度保証のための設定とか無いのかなと思って探したんだけと見つからない。
それじゃ科学技術計算用途としては結構弱点なのでは?と思ったんですが、
JuliaのBigFloatはGNU MPFR Libraryを使っているそうで、
MPFRのFAQに、
Also remember that MPFR does not track the accuracy of the results
と書いてあるので、仕方ないみたい。
setprecision(10000)
にしたら必要なところ(約1000桁)まで十分過ぎる正確な値(約3000桁)が表示されました。
最後の2桁は違う数字になってましたが、そこそこ保証できる範囲までしか表示しないのは、MPFRの機能なのかJuliaの機能なのか知りませんが、それはそれで有り難いとは思いました。
Juliaって科学技術計算を重視した言語だと思ってて、当然高精度計算用の機能がいろいろ組み込まれてるだろうと勝手に思い込んで、precisionの指定はその精度保証と思ってしまってたのが戸惑いの原因でした。
思い込みって恐ろしい。。。