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 桁になるようです。詳しくは、こちらでどうぞ。
以上、如何でしょうか?