• 締切済み

JavaScriptの演算精度は?

JavaScriptの演算にはIEEE 754が使用されていると聞いたのですが、その演算の精度はどれくらいですか? 小数を丸めて正しい答えを導きたいのですが、その場合どの桁を四捨五入すれば最も精度が良いですか? また、どれくらいの数までであれば正確に計算できますか? 体感的には15桁程度であれば正確だと考えています。 さらに、四捨五入を行う際に*1000000してから四捨五入し、あとで1000000で割ったりしようと思うのですが、その場合も桁溢れなどの可能性がありますか? 電卓を作成しようとして、精度につまずきました。 利用者に精度の説明をしたいのですが詳しくないため、困っています。 CPUが32bitの場合と64bitの場合の両方で教えて欲しいです。 ご存じの方がいらっしゃいましたらよろしくお願いしたします。

みんなの回答

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.4

> 積の保障すべき小数部桁数は > 乗数と被乗数のおのおのの小数部桁数の和と同じでした。 間違っています。 http://fnorio.com/0034significant_figure1/significant_figure.htm

inuchokin
質問者

お礼

ありがとございます。 たしかに末尾が信頼できないとすればそうなりますね。 しかし、実際の電卓は(科学技術向けでもない限り)そのような計算はしませんよね。 現実的に実装するには、ということが知りたかったのですが、 とても勉強になりました。ありがとうございました

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

> 掛け算割り算が入るとややこしそうですね。 最初からそう思い込んでいらっしゃるだけではないですか。 細かいレベルで計測できず信用できない桁の数字を■で表して,筆算の過程を紙に描いてみてはいかがでしょう。一例はこんな感じ。 2.18■ ×2.2■ ――――― 乗数と被乗数の有効桁数をいろいろ変えて試してみれば,■の影響が下位何桁に及ぶのか,乗算の有効桁数を決める要因は何なのか,目に見えてくると思います。 (加算減算はこの方法で示さなくても明らかだと思ったので省略しただけです)

inuchokin
質問者

お礼

ありがとうございます。 思い込みでした。 やってみたところ、積の保障すべき小数部桁数は乗数と被乗数のおのおのの小数部桁数の和と同じでした。 予想外でした。 しかし、商でつまずきました。 割り算だとどうしても予想できず、パターンがわかりません。 なにかいい方法はありますか?

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

172cm と 172.00cm は違うという点の理解は大丈夫でしたか。 前者は,cmの単位までは正確に計測したがそれより細かいレベルでは計測できなかったという表明です。 後者は,mmの単位まで00だと正確に計測したがそれより細かいレベルでは計測できなかったという表明です。 両者は有効桁数(精度)が異なるわけです。 > 小数を丸めて正しい答えを導きたいのですが、 > その場合どの桁を四捨五入すれば最も精度が良いですか? 入力データの有効桁数を基にすればよいのではないですか。 加減算においては,表明された有効桁数以上に精度を良くする意味は無いでしょう。 元データにおいて,それより細かいレベルの桁は計測上,信用できない数値なのですから。 > 2.2-2が0.20000000000000018となり、 2.2と入力する行為は,小数点以下1桁の精度であるという表明ですから, コンピュータの演算結果をそのまま出力しているプログラマの責任だと思います。 ですから,2.20000000000000000-2 と入力したのに, 0.20000000000000018 という結果が出てきたらそれはマズイわけです。プログラム的にそんなに長い有効桁数を扱えないのなら,そもそもそのような長い桁数の数値を入力できないように設計する必要があるでしょう。 > どれくらいの数までであれば正確に計算できますか? > 体感的には15桁程度であれば正確だと考えています。 http://okwave.jp/qa/q7504019.html の私の回答ANo.3

inuchokin
質問者

お礼

ありがとうございます! やはり、丸めるしかないのですね。 しかし、2.2の入力が有効桁数2桁を示すのは加減算のときだけで、掛け算割り算が入るとややこしそうですね。 参考回答を見て、自分なりに勉強してみます。

  • k_kota
  • ベストアンサー率19% (434/2186)
回答No.1

まず、浮動小数点の表現について、手を抜かずに勉強してください。 そして、桁落ちとかの概念も学んでください。 64bitだと仮数部52bitなので割合で行けば 2^(-52)が最低の誤差です。 小数を丸めて正しい~、と言うのがどういうことか詳しく説明して下さい。 基本的には丸め操作はしないのが良いです、やるなら最後に。 精度については、ざっくりいって64bit浮動小数点では10進数で15桁分は精度あるみたいですね。 んで、四捨五入については考えない方がよいです、なんのメリットもありません。 CPUも関係ありません、32bitCPUでもOSでも浮動小数点は64bit使うでしょう。 説明する側になるのであれば、きちんと調べる方が良いと思います。 wikiのまとめで十分分かると思います。 そこで分からないなら改めて聞くのがよいかもしれません。 手も脚も出ないなら説明は諦めたほうが良いと思います。

inuchokin
質問者

補足

ありがとうございます。 桁落ちや浮動小数点の表現については勉強しようと思っていますが、取り急ぎ知りたかったので質問しました。 >小数を丸めて正しい~ とは、例えば2.2-2が0.20000000000000018となり、 20.2-20が0.1999999999999993となるのですが、それを10進数で計算したときの答えと同じように0.2という答えが欲しいのです。 そのために丸めを行いたいのですが、どのように丸めれば(勿論丸めは最後に行います)精度が保証されるのか(またそれはどの範囲で保証されるのかを知りたかったのです。 知識不足と表現のゆれでわかりづらいとは思いますがお願いいたします。

関連するQ&A