Rの有効桁
R-Tips様より、
options()の中で、
digits: 数値を出力する際の表示桁数を設定する(デフォルトは7).
scipen: 指数表現にするか否かの閾値を設定する(デフォルトは 0).
だそうです。
> options()$digits
[1] 7
ほー、そうかそうか。
> 12345678
[1] 12345678
え〜と?8桁の数を書けてるぞ。
# 12桁までは指数表記にならない?
> 123456789012
[1] 123456789012
# 13桁からは浮動小数点表記。この有効桁はdigitsの値。
> 1234567890123
[1] 1.234568e+12
何故??
options()$digits の果て
> options(digits=100)
以下にエラー options(digits = 100) :
'digits' のパラメータが不正です: 0...22 が認められています
[0, 22]だそうですね。
まずは、options(digits=0)
にしてみる。
> 1234 # 4桁
[1] 1234
> 12345 # 5桁
[1]1.e+04
ホッホー。
法則性がよく分からない…。
次に、options(digits=22)
にしてみる。
> 1234567890123 # 13桁
[1] 1234567890123
おお。頑張っている。
> 123456789012345678901234567 # 27桁
[1] 123456789012345678152597504
> 1234567890123456789012345678 # 28桁
[1] 1.234567890123456850245e+27
ホッホー。.....んん???
> 123456789012345678901234567 # 27桁
[1] 123456789012345678152597504
↑
> 1234567890123456789012345678 # 28桁
[1] 1.234567890123456850245e+27
↑
27桁表記の方は、19桁目が、上では9
なのに、下では1
。
指数表記でも、17桁目から違っていますね。
...ヨォわからん。
options()$scipenの挙動
とりあえず、options(scipen=20)
ぐらいにしてみる。
> 123456789012345678901234567 # 27桁
[1] 123456789012345678152597504 # 19桁から不正確
↑
> 1234567890123456789012345678 # 28桁
[1] 1234567890123456850245451776 # 指数表記は回避され、17桁から不正確
↑
嘆息。
{Rmpfr}の挙動
真打ちの登場です。
前回の投稿で紹介した多倍数精度を取り扱うパッケージ。
install.packages("Rmpfr")
library(Rmpfr)
さてさてさて。
> mpfr(12345678901234567890123, 100)
1 'mpfr' number of precision 100 bits
[1] 12345678901234567741440
↑
> mpfr(12345678901234567890123, 100000)
1 'mpfr' number of precision 100000 bits
[1] 12345678901234567741440
↑
あれ???
結論
結局、誤差がないのは15桁ぐらい?
という事は、double型と同じじゃん。
指数表記を回避したいだけなら、digits
とscipen
で、良くね???
{Rmpfr}を使っても、計算精度自体は上がらない。