Archive for 2013年11月|Monthly archive page

projecteuler13...または、有効桁数について

 projecteuler問題13は、既にやっていますが、今回は番外編。
 大整数(big integers)が使えるようになった newLISP には簡単な問題ですが、求める答えが和の最初の 10 桁だけなら、大整数を使うまでもありません。
 組込関数 bigint前回bigint の代わりに eval-string を使っています)で大整数にせずとも、float を使って浮動小数点数で計算しても、こと足りるのです。
 何故なら、問題は高々 50 個の加算ですから、10 桁の値を得るには、12 桁の精度を保持しておけば十分です。そして、

> (format "%f" (float 37107287533902102798797998220837590246510135740250L))
"37107287533902104311025740304689820495323647180800.000000"
>

 このように、newLISP の浮動小数点数は 64 ビット長倍精度なので、16 桁くらいまでは精度が保たれます。つまり、問題13 は newLISP の浮動小数点数で十分対応可能です。
 浮動小数点数に変換したリストを入れた data を使って、結果だけ記せば、

> (apply add data)
5.53737623e+051
> (format "%f" (apply add data))
"5537376230390877287140145935443224959721771787878400.000000"
> (0 10 (format "%f" (apply add data)))
"5537376230"
> 

 こんな感じで、答えは合っています。
 まっ、大整数のある newLISP には要らぬことですが(笑)。
 今回の例ではピンと来ないかもしれませんが、技術計算では有効桁数を常に頭に入れて置くことが必須です。newLISP を使っていると往々にして忘れがちですが(汗)。
 ちなみに v.10.5.5 から、大整数の整数演算における引数が二つという制限がなくなり、ますます使いやすくなります。また、浮動小数点数の標準表記も 10 桁から 15 桁になるようです。詳しくは、こちらでどうぞ。

 以上、如何でしょうか?