bigint.js v0.5 beta 16

2004-01-09

5つの要素からなるテーブル[0][1][2][3][4]を二乗すると、 結果のテーブルでいちばん「重なる」のは添え字4番であり、5通りの発生元がある。 実際には例えば13と31は同じだから片方だけ計算すればいいが、 ここでは結果の大きさを評価するために別々に数える。 すると、結果の添え字4番のところは、第一の数のどのテーブルのますからも発生する。 5より上は入力の添え字0からは作れないから、重複度が低い。 3より下は入力の添え字4からは作れないから、重複度が低い。 一般に、いちばん重複度が高いのは入力テーブルの最後の添え字にあたる場所であり、 テーブルの長さだけ重複できる。 ところが、__BIGINT_JS_INT_MAX / (9999999*9999999) は、90.072だから、重複度90までは精度が保てる。 つまりテーブルの長さ90=630桁の平方までは、 繰り上がり処理を最後に一度だけやればlossyなオーバーフローがないことが保証される (現実にはもう少し大きくても大丈夫だが630桁なら絶対確実に保証される)。 新しいアルゴリズムでは、「テーブル値を増やした結果が (__BIGINT_JS_INT_MAX - (9999999*9999999)*2 - 9999999 ) = 8807199284740991 以下なら、どう転んでも次の加算で __BIGINT_JS_INT_MAX を超過することはない」という考えで動く。 630桁以内ならこのことは起きないから考えないでいい。 それ以上を含む一般の場合、足した結果の現在値が上の値を越えたときだけ繰り上がり処理をする。

New Demos
Old Demos
Output
Debug

[index]