裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

「電卓」の仕様

2016年01月13日 | ブログラミング

ということであるが,ここでいっている「電卓」は,コンピュータ上に実装されているもの。

「電卓の」仕様はさまざまというか,単純に倍精度実数を使って実装されているならば,まさにバグでもなんでもない。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

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村