巨大数
円周率、素数、フラクタルなど計算するときに、有効桁数が重要になってくる。しかし、ProcessingだとBigDecimalかBigIntegerを使う必要があり不便。
では、pyモードやjsモードはどうなのか。
Processingはjavaの制限を受ける。✗
Processing.pyもjavaの制限を受ける。✗
p5.jsのbigintも良さそうだがmathが使えない。
やっぱり「pythonしか勝たん」のか?
対象
Processing(java)
p5.js
Processing.py
※windowsでは32bit版と64bit版があるので、違うかも。
比較表(整数のみ)
環境 | min | max |
---|---|---|
Processing int | -2,147,483,648 | 2,147,483,647 |
Processing long | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
Processing.py int | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
java BigInteger | -2^5億?メモリ依存? | 2^5億?メモリ依存? |
java BigDecimal | 桁指定可、2^31-1=2147483647桁 | |
python 整数型 | 上限なし、メモリ依存 | 上限なし、メモリ依存 |
p5.js | 同下 | 同下 |
JavaScript number | -(2^53-1) -9,007,199,254,740,991 |
2^53-1 9,007,199,254,740,991 |
JavaScript bigint | -3.2億桁?メモリ依存 | 3.2億桁?メモリ依存 |
注:最大の素数は4100万桁
困るケース
例えば12^13 = 106,993,205,379,072であり、必要桁数は、int(32bit)とlong(64bit)の間であるが、
processing(java)のpowはfloat(32bit)で計算されているので正確ではない。
processing(java)
print(pow(12,13)); // 1.06993205E1 精度不足
print(12*12*12*12*12*12*12*12*12*12*12*12*12); // 1275068416 桁溢れ
print(12l*12l*12l*12l*12l*12l*12l*12l*12l*12l*12l*12l*12l); // 106993205379072 正確
float(32bit)精度であれば、せいぜい7桁ぐらいしか保証されない。
processing(java)
println(pow(10,6)+1);
println(pow(10,7)+1);
println(pow(10,8)+1);
println(pow(10,9)+1);
println(pow(10,10)+1);
println(pow(10,11)+1);
output
1000001.0 // OK
1.0000001E7 // 表示がE表記になる
1.0E8 // 精度が限界を超える
1.0E9 // 同上
1.0E10 // 同上
9.9999998E10 // 誤差が目立つ
オンラインpython,p5js環境