巨大な数を計算するJavaScriptプログラムの開発ノート。
処理内容 | Ver.0.3 | Ver.0.4 | Ver.0.5 |
---|---|---|---|
2の10000乗 | 1300ms | 450ms | 350ms |
2の50000乗 | 33000ms | 5000ms | 4300ms |
1000の階乗 | 1000ms | 350ms | 350ms |
400桁の10進数を2進数に変換 | 1000ms | 250ms | 250ms |
ルート2小数点以下1000桁 | 2000ms | 600ms | 550ms |
以下、巨大数演算Ver.0.5の開発記録。 外見は同じだが基本設計はVer.0.4とは異なる。 作ったプログラムのバージョン一覧。
未完成だった関数の作成と、除算で発生する問題を修正。具体的にはalpha2で変更した16桁の商を元に戻した。精度限界以上では変数の格納も信頼できないため、誤差修正できても強制的に精度を超過した部分が丸められてしまう。
除算を追加。 14桁区切りだった除算を15桁で行えるようにした。 本来15桁で区切ると商が16桁になりJavaScriptの精度限界を越えてしまうが、元々除算関数は誤差を考慮して作られているため、少しぐらい精度が乱れようと自力で誤差を修正できる。 演算速度はVer.0.4Finalと同じぐらい。
long_mulを使わずに同等の速度が出せたところでVer.0.4と同じスタートラインについた。
リンク先のChangeLog参照。今後は全て個々のディレクトリ内のChangeLogに記述する。
alpha1の配列型とVer.0.4の文字列型の両方が使えるように改造した。 これによって各データ形式ごとの最短コースをカットできるようになった。 ただしまだ最短コースは用意していない。
今回HugeIntオブジェクトに新たにmodeを追加。 ここに配列型か文字列型かの判別情報を格納する。
また、以前まではHugeIntオブジェクトに自動変換する関数はHugeInt.sakuraだけだったが、今回はHugeInt.naru,HugeInt.sakura,HugeInt.airiの3種類を用意した。
この3つの変換関数で2種類のデータ形式間を行き来するという作戦だ。
アルゴリズムはVer.0.4と同じだが、データ型を純配列にした。これによって乗算時のデータ型変換が不要になり乗算が20%高速化。Ver.0.4終盤で導入せざるをえなかった、連続乗算関数long_mulを使わずして同程度の速度を出すことが目的。
Ver.0.5は演算プログラムとHTMLとの相関性を完全に断ち切った。 演算用の.jsファイルのみを読み込むとプログラムは完全にサイレントモードになり、出力フォームとwriter.jsを追加するとフォームに結果を表示できるようになる。 そしてさらにdemo.jsを読み込むと動作テスト用のサンプル集が起動する。通常巨大整数計算を行いたいときはwtriter.jsまでを読み込めばよい。
Ver.0.4ではファイルインクルード用のloader.jsが存在したがVer.0.5ではHTMLと連動するということで廃止した。
現時点では外部で利用する場合の関数ライブラリが完全に揃っていない。