Javascript で、「四倍精度浮動小数点数」ないし「拡張倍精度浮動小数点数」を扱えるライブラリ・プラグイン等はありますか?
Google で検索しましたが、それっぽいものは確認できませんでした。
自分で頑張ってビット演算なり何なりを駆使して、オレオレライブラリを書くしか無いのでしょうか
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
JavaScriptで長精度の浮動小数(的なもの?)を扱えるbignumber.jsというライブラリーがあります。詳しく見ていないのでなんとも言えませんが、これは「四倍精度浮動小数点数」ないし「拡張倍精度浮動小数点数」といったものではなく、もっと汎用的(かつ若干素朴?)なもので、任意の精度での演算を可能とするものだと思います。おそらく「四倍精度浮動小数点数」ないし「拡張倍精度浮動小数点数」に限定したものより速度的に劣る気がしますが長精度の演算ができればよいのであればこのライブラリーも検討の余地があるのではないでしょうか?
実際に使ってみますと・・・
sh
1$ cat t.js 2const BigNumber = require('bignumber.js') 3 4let x = BigNumber('1.5') 5for (let i = 0; i < 5; i++) { 6 x = x.multipliedBy(x) 7 console.log(`x = ${x.toString()}`) 8} 9console.log(x) 10console.log(typeof x.c[0]) 11$ node t 12x = 2.25 13x = 5.0625 14x = 25.62890625 15x = 656.8408355712890625 16x = 431439.88327398919500410556793212890625 17BigNumber { 18 s: 1, 19 e: 5, 20 c: [ 431439, 88327398919500, 41055679321289, 6250000000000 ] } 21number
最後の結果はこのライブラリーが数値の内部表現をどう実現しているかをうかがい知るために表示してみたものですが、見る限り仮数部を10進数14桁ほどの整数の並びに分割して保持しているようです。JavaScriptのnumberはIEEE754の64bit浮動小数点数を用いていると思うのですが、最後の結果から一つのnumber(64bit)で10進14桁(概ね46.5bit)を表現しているので効率的にはIEEE754のような「余分なビットのない二進数表現」に比べると同じメモリー量でも72%ほどの精度に制限されてしまうと思います。それがメモリー効率(および多分計算速度も)が最良とはいえないと推測した根拠です。しかしながらこのライブラリーで長精度の演算が実現できるのは確かであると思いました。
なお、もっと効率の良いもの(高速なもの)が必要ならC/C++で実装された任意精度の算術ライブラリ(例えばgnuのGMPなど)をJavaScriptから使うというような戦略が取れる気がします。というか「GMP javascript」で検索するといくつか見つかるので誰かが既にJavaScriptバインディングを開発済みのように見えました。そうしたものを調べてみてはいかがでしょうか?bignumber.jsよりもっと高速な演算が期待できる気がします。(自分は試してませんが・・・)
投稿2019/07/01 02:36
総合スコア18404
0
私も見つけられませんでした。
多倍長整数はいくらでもあるんですが、倍精度より高い浮動小数点数が必要な場面は限られているということでしょうかね。
自作するのであれば、intを元に拡張倍精度や四倍精度を作るより、double-doubleを使うのが高速でよいと思います。(ただし精度が増えるだけで表せる値の範囲はdoubleと変わらない)
https://ja.wikipedia.org/wiki/四倍精度浮動小数点数#double-double演算
投稿2019/07/01 00:40
総合スコア3047
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
これらはどうでしょう。いづれもnpmでゲットできます。
https://github.com/munrocket/double.js
https://github.com/hiroshi-manabe/JSDecimal
https://github.com/MikeMcl/big.js/
投稿2019/07/01 02:16
総合スコア777
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/01 12:48

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/01 13:58