こういうバグもあった。 フェルマーの最終定理の「反例」(電卓編)
http://blog.unfindable.net/archives/621
ということであるが,ここでいっている「電卓」は,コンピュータ上に実装されているもの。
「電卓の」仕様はさまざまというか,単純に倍精度実数を使って実装されているならば,まさにバグでもなんでもない。Windows の電卓アプリは素晴らしくて,Mac のはダメだというのは筋違い。
99992800^3 は 10 進数で何桁になるか?
> 3*log10(99992800)
[1] 23.99991
そう。24桁だ。dobule で正確に表現できる整数は たかだか 15,6 桁なので,そんな大きな数は扱いきれない。(言うまでもないことであるが 15,6 桁の範囲内の整数であれば,「コンピュータは2進数で表現するので,誤差がある」なんてことはない。整数は常に「正確に」表される)。有効数字が足りない。15,6桁目以降はゴミだ。
このブログの著者は,
> 9999999999999999999999999^9999999
[1] Inf
という結果が出るのもバグだというのだろうかね。
扱いきれない,大きな2数の和から大きな数を引いて,正確な答えが出るわけがない。だからダメだなんて言ってもお門違いも甚だしい。
正しい答えを得るにはどうするか。大きな数を扱える仕様を策定しないといけない。
簡単な四則演算関数を自作するもよし,すでにあるパッケージ(gmp)を使うも良し。
Rmpfr は,使用するビット数を指定できるので,ある桁数の数字を表現するのに何ビット必要か体感できる。
> library(Rmpfr)
> prec = 80 # double の精度なら 53 だ。
> a = mpfr("5999856", prec)
> b = mpfr("99992800", prec)
> c = mpfr("100000000", prec)
> print(a^3+b^3-c^3)
1 'mpfr' number of precision 80 bits
[1] -2985984