読者です 読者をやめる 読者になる 読者になる

廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

2進法、コンピュータ、小数、恒等、ニアリーイコール

Statistical Computing with R (Chapman & Hall/CRC The R Series)

Statistical Computing with R (Chapman & Hall/CRC The R Series)

ちょっと煮詰まってきたので仕方なく11章の頭から読む




たとえばこれなんかは典型的な例だと思うんだけど、Rで

 >.3-.1
[1] 0.2
#0.3-0.1の計算結果は0.2なのに、
> (.3-.1)==2
[1] FALSE
#「0.3-0.1は2と等しい」という文は<span style="font-weight:bold;">偽</span>(FALSE)と判定されてしまう
> .2-(.3-.1)
[1] 2.775558e-17
#0.2 - (0.3-0.1)は0ではなくて0.00000000000000002775558になっちゃってる

なんでこういうことが起こるかというとコンピュータは二進法をつかってるからなのである
十進法での0.2は二進法では0.001100110011...と無限に続く小数になる
コンピュータで無限は扱えないので細かーいところで切り捨てた誤差が残っているのだ
テキストには
「良い男はレディとレディを比較しない。良いプログラマ浮動小数点数浮動小数点数を比較しない。」
って書いてあるよ。ひでーなー

ちなみに、RにはdigitsBaseという好きなpでp進展開してくれる関数がある。

>  library("sfsmisc")
>  digitsBase(10,base=3) #base=2がデフォルト
Class 'basedInt'(base = 3) [1:1]
     [,1]
[1,]    1
[2,]    0
[3,]    1

でも、非負の整数にしか使えないみたいなので、今回は出番なし
0.2(十進法)=0.001100110011...(二進法)
を確かめるには手で計算する
(こちらを参照:http://ja.wikipedia.org/wiki/%E4%BA%8C%E9%80%B2%E6%B3%95

さて、こう言うことが起こるので「ほとんど等しい」かどうかを判定する関数がある

> isTRUE(all.equal(.2,.3-.1))
[1] TRUE

isTRUEとall.equalを使うと、ちゃんとTRUEになった


また、

> y <- 2
> x <- 1:4
> x == y		#ひとつの真理値とは限らない
[1] FALSE  TRUE FALSE FALSE
#こんな風にベクトルとスカラーを比較すると、一行ずつ真理値がかえってくる
#identicalでは恒等的に、ていうか対象どうしが完全に等しいときにTRUEになる
#(数学科としてはこっちのほうが自然な感じがします)
> identical(x,y)		#つねにひとつの真理値
[1] FALSE
> identical(y,2)
[1] TRUE
> y <- rep(2,4)
> y
[1] 2 2 2 2
> identical(y,2)
[1] FALSE
> identical(y,y)
[1] TRUE
> identical(y,c(2,2,2,2))
[1] TRUE


ところで、

> isTRUE(all.equal(.2,.3-.1))
[1] TRUE
<<
はいいんだけど、all.equalの返してくる
>>
> all.equal(.2,.3)		#論理値でない
[1] "Mean relative difference: 0.5"

ってどういう意味なのか?

> isTRUE(all.equal(.2,.3))		#つねに論理値
[1] FALSE

これがちゃんとFALSEになるのはいいんだけど、「ほとんど等しい」の基準ってなんなのか?
わからないのでおいておく




Statistical Computing with R (Chapman & Hall/CRC The R Series)

Statistical Computing with R (Chapman & Hall/CRC The R Series)

ここまでがおおむね↑の本の11章のはじめからExample11.1までの内容に相当する