綾小路龍之介の素人思考

[perl] 2**1023は数なのに、sigma(1023,0) 2**i はinfになる

どこまで数の大きな計算ができるのか知りたかったのでいろいろ試していたら不思議な挙動?

2のn乗を計算して、bcの結果と比較する。2^1024はinf、2^1023以下はbcの結果と同じ。

$ echo 'n=0;for(i=1024;i>=0;i--){n=2^i;n}' | bc | perl -ne 'chomp;if(s/\\//){print $_}else{print "$_\n"}' > inf.bc.txt
$ perl -e 'BEGIN{$n=0}for($i=1024;$i>=0;$i--){$n=2**$i;printf "%.0f\n",$n}' > inf.pl.txt
$ diff inf.pl.txt inf.bc.txt
1c1
< inf
---
> 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216

2^1023まで表現できてたということは、1023ビットまでは表現できると考えて、1023番目以下のビットを立てていく。すると、53行目までは等しいが、それ以降はinfになってしまう。

$ echo 'n=0;for(i=1023;i>=0;i--){n+=2^i;n}' | bc | perl -ne 'chomp; if(s/\\//){print $_}else{print "$_\n"}' > inf.bc.2txt
$ perl -e 'BEGIN{$n=0}for($i=1023;$i>=0;$i--){$n+=2**$i;printf "%.0f\n",$n}' > inf.pl.2txt
$ diff inf.pl.2txt inf.bc.2txt | less

なんかおかしくないか?

リファレンス

  1. Manpage of bc
  2. Perlの数値処理 - Islands in the byte stream
  3. perl inf - Google 検索
  4. perlnumber - Perl での数値と数値操作の意味論
  5. perl 数字 最大 - Google 検索
  6. Perlでの数値の最大値 - グニャラくんのグニャグニャ備忘録@はてな
  7. perl 数値 最大 - Google 検索

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2009-07-17T03:30:25+09:00
  2. Modified: 2009-07-17T03:30:25+09:00
  3. Generated: 2017-07-17T23:09:17+09:00