[1] [CITE[CPAN/src]] ([TIME[2009-11-17 07:02:08 +09:00]] 版) [2] 64ビット環境で実験してみた。 [PRE(perl)[ $ perl -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 51 x = 2.25179981368525e+15; x+1 = 2251799813685249; x == x+1 = 0 $ perl -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 52 x = 4.5035996273705e+15; x+1 = 4503599627370497; x == x+1 = 0 $ perl -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 53 x = 9.00719925474099e+15; x+1 = 9.00719925474099e+15; x == x+1 = 1 $ perl -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 54 x = 1.8014398509482e+16; x+1 = 1.8014398509482e+16; x == x+1 = 1 ]PRE] [[64ビット浮動小数点数]]の[[仮数]]が[[二進数]]で53桁らしく、それが[[整数]]を正しく表現できる限界らしい。 [PRE(perl)[ $ perl -Minteger -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 51 x = 2.25179981368525e+15; x+1 = 2251799813685249; x == x+1 = 0 $ perl -Minteger -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 52 x = 4.5035996273705e+15; x+1 = 4503599627370497; x == x+1 = 0 $ perl -Minteger -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 53 x = 9.00719925474099e+15; x+1 = 9007199254740993; x == x+1 = 0 $ perl -Minteger -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 54 x = 1.8014398509482e+16; x+1 = 18014398509481985; x == x+1 = 0 $ perl -Minteger -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 62 x = 4.61168601842739e+18; x+1 = 4611686018427387905; x == x+1 = 0 $ perl -Minteger -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 63 x = 9.22337203685478e+18; x+1 = -9223372036854775807; x == x+1 = 0 $ perl -Minteger -e '$a = shift; printf "x = %s; x+1 = %s; x == x+1 = %s\n", 2**$a, 2**$a+1, (2**$a==2**$a+1)?1:0' 64 x = 1.84467440737096e+19; x+1 = 0; x == x+1 = 0 ]PRE] [CODE(perl)@en[[[use]] [[integer]]]] すると2の63乗の1つ手前まで[[整数]]として扱えるようになる。