Rを使っていて、大きな数字が指数表示になってしまうことを避けたいということがあります。
今回遭遇したのは、13桁の整数値です。
実際に試したのは、9223372036854775807(19桁)の数字。
符号付き64ビット整数の最大値です。
結果はこんな感じです。
1 2 3 |
<span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">options(scipen = 100) </span><span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">9223372036854775807 </span><span class="GNKRCKGCGSB">[1] 9223372036854775808</span> |
1の位が変ってしまっています。
試しに、scipen=1000とかにしてみました。
1 2 3 |
<span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">options(scipen = 1000) </span><span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">9223372036854775807 </span><span class="GNKRCKGCGSB">[1] 9223372036854775808</span> |
やっぱり駄目でした(^^ゞ
一けた削ってみたら。
1 2 |
<span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">922337203685477580 </span><span class="GNKRCKGCGSB">[1] 922337203685477632</span> |
おいおい(一一”)
ということで限界を確認することにしました。
1 2 3 4 5 6 7 8 9 |
<span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">2^53 </span><span class="GNKRCKGCGSB">[1] 9007199254740992 </span><span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">2^53-1 </span><span class="GNKRCKGCGSB">[1] 9007199254740991 > 2^54-1 [1] 18014398509481984 > 2^54 [1] 18014398509481984 </span> |
2の53乗〜54乗の間に限界がありそうです。
1 2 3 4 5 6 7 8 |
<span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">2^53 </span><span class="GNKRCKGCGSB">[1] 9007199254740992 </span><span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">2^53+1 </span><span class="GNKRCKGCGSB">[1] 9007199254740992 </span><span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">2^53-1 </span><span class="GNKRCKGCGSB">[1] 9007199254740991 </span><span class="GNKRCKGCMSB ace_keyword">> </span><span class="GNKRCKGCMRB ace_keyword">2^53-2 </span><span class="GNKRCKGCGSB">[1] 9007199254740990</span> |
2の53乗が限界なのかな?
double 64ビットで表現できる数値の限界は、
±5.0e−324 から ±1.7e308
ですが、有効桁数は15〜16桁となっています。
そこから類推すると、内部で64ビットのdoubleで数値を持っているからなのかも知れませんね。
ということで、options(scipen = ???)はとても大きな数字を扱う時には注意した方が良さそうです。