1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Processing系で巨大数の計算メモ

Posted at

巨大数

円周率、素数、フラクタルなど計算するときに、有効桁数が重要になってくる。しかし、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環境

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?