卒研メモ:JavaScriptで多倍長計算

 前から興味があったので,JavaScriptでの多倍長計算をまじめに考えてみました。数値計算用のライブラリとしては既にmath.jsってのがあって,ここではDecimal.js(10進多倍長演算)を使ってのBigNumberオブジェクトが使えるようです。で,これより速い多倍長計算ができないかな?ということです。

 定番としては,既存FP数を組み合わせて多倍長化するMulti-digits(Muti-term)方式で実装すれば,そこそこ早くできるだろうという予測は容易いのですが,データ型テキトーなJavaScriptでは倍精度型を二つ組み合わせて作るということもそう簡単ではなかったりします。とはいえ,今ではFloat64Arrayという,データ型宣言ができる機構がありますので,そろそろMulti-digits多倍長のJS版ができるかなと。今のところググっても実装したものはなさそうなので,やっても無駄という可能性もあります。ま,失敗報告でもいいかなと。

 あとは,どのぐらい既存の高速化テクニックがJavaScriptで可能なのか?というテーマを追究したいところです。色々調べてみたところ,Emscriptenが大分使いやすくなってきているようで,C/C++ソースをJavaScriptにコンパイル(変換?)できるようになっており,さらにWebAssemblyというLISPのようなS型スタック機構を備えたアセンブラっぽいものもW3CのドラフトJavaScript APIWeb APIもある)になっています。一応,FirefoxとChromeでは使えるっぽい。128bitのSIMD命令の実装例もありました。

 以上のあらましは日本語記事()で大体掴めます。

 ただ,このレベルになると今後きちんと実用化されるのかどうか,そのうち放置プレイとなるのか,世間のニーズ次第ということになります。WebAssemblyに熱心なのはMozilla開発陣だけで,日本語記事を執筆された方もその一員なんですよね。

 しかしながら,どう頑張ってもネイティブ環境下以上の高速化はJavaScriptでは無理ですから,まずは使いやすくてそこそこ速いという程度で納めておくのが吉かなと。

 ボツボツ,現実逃避がてら遊んでみることにしましょう。