質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

3回答

2310閲覧

Javascript での「四倍精度浮動小数点数」ないし「拡張倍精度浮動小数点数」計算の方法

John.doe

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

5クリップ

投稿2019/06/30 19:12

Javascript で、「四倍精度浮動小数点数」ないし「拡張倍精度浮動小数点数」を扱えるライブラリ・プラグイン等はありますか?
Google で検索しましたが、それっぽいものは確認できませんでした。

自分で頑張ってビット演算なり何なりを駆使して、オレオレライブラリを書くしか無いのでしょうか

atata0319👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

John.doe

2019/07/01 13:58

今回はあくまで個人的な用途なので、速度・効率等のことは深く考えていませんでした。 サンプルコードと結果を示していただけたので、分かりやすくて助かりました。 試行錯誤してみようと思います。 観点の提示含め、感謝しております。
guest

0

私も見つけられませんでした。
多倍長整数はいくらでもあるんですが、倍精度より高い浮動小数点数が必要な場面は限られているということでしょうかね。

自作するのであれば、intを元に拡張倍精度や四倍精度を作るより、double-doubleを使うのが高速でよいと思います。(ただし精度が増えるだけで表せる値の範囲はdoubleと変わらない)
https://ja.wikipedia.org/wiki/四倍精度浮動小数点数#double-double演算

投稿2019/07/01 00:40

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

John.doe

2019/07/01 13:46

Google でヒットしないのが私の環境固有ではないと確認できました。 ありがとうございました。 実装方針についての指摘、ありがとうございました。
guest

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

so87

総合スコア764

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikadzuchi

2019/07/01 12:48

2番めと3番めは多倍長の十進小数であって四倍精度や拡張倍精度とは別物ですね。 1番めはdouble-doubleで、私もお勧めしますが、やはり四倍精度や拡張倍精度とは異なります。 求められているものと異なるものを説明無しで示すのは不適切でしょう。
John.doe

2019/07/01 13:54

日本語として不正確なところがあり、申し訳ございませんでした。  「四倍精度浮動小数点数」「拡張倍精度浮動小数点数」等 と表現すべきでした。ご迷惑をおかけしました。 ・「四倍精度浮動小数点数」または「拡張倍精度浮動小数点数」でなければならない という限定列挙の趣旨ではなく ・「四倍精度浮動小数点数」「拡張倍精度浮動小数点数」のように、Number型より精度の高い既存の実装があれば使いたい という例示として考えていました。その点が明確に表現されておらず、不備でした。 今回は https://www.npmjs.com/search?q=keywords:decimal https://www.npmjs.com/search?q=keywords:float あたりが検索の手掛かりになるようですね。 その他にも npm 検索の方法があると分かり、今後に活かせそうです。 ありがとうございました。
so87

2019/07/03 00:25

> ikadzuchiさん ご指摘ありがとうございます。 確かに言葉足らずで回答として不適切でした。
so87

2019/07/03 00:25

> John.doeさん 拡張倍精度でも四倍精度でもどちらでも良さそうに思えたので、 単純に「jsで64bitより高精度な浮動小数点を扱う場合に、一般的なモジュールってありますか?」という質問として解釈しました。 検索でヒットするそれっぽいものでもよさそうに思えたので、 npmでそれっぽいもの(疑似4倍、任意精度10進)をご提案しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問