- ベストアンサー
浮動小数点の計算について
Javaで0.1+0.2を計算すると0.30000000000000004になったり、10.0-9.9を計算すると、0.09999999999999964になったりするのはなぜですか? 参考書では。 「浮動小数点数を使った計算では、一見正確な値が計算されてるように見えてもほとんど場合内部では少しだけ誤差を含んだ値を持ってると、考えた方がいいでしょう。どのような計算を行った時にどの程度の誤差が出るのかは難しい話題になるのでこの本では詳しく説明しませんが、例えば100.0-99.99のように同じぐらいの数同士で引き算を行うと誤差が現れやすくなります。」 と書いてありました。 この本ではこれだけで説明が終わりました。 なぜ浮動小数点で計算を行うと誤差が出るのか詳しく教えていただけると助かります。
- saiumalsei
- お礼率3% (18/466)
- Java
- 回答数4
- ありがとう数0
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
浮動小数点数は、2進数で表現されているので、2のべき乗の和しか正確に表現できません。 任意の整数は2のべき乗の和で表現できるので、有効桁数の範囲では正確に表現できます。 少数部分は、1/2, 1/4, 1/8, 1/16, 1/32,....... からいくつか選んだ和であれば、有効桁数の範囲では正確に表現できます。 0.1や0.2は、2進数では無限小数になるので、有限桁で切ると必ず誤差が生じます。
その他の回答 (3)
簡単に説明すると、コンピュータの計算は全て『スイッチのオンとオフ』で扱われています。 つまり、いくら高速で計算しているとはいえ、結局は有限個の桁数までしか計算できず、どこかで四捨五入して表示しているのです。 もう少し的確に言えば、少数計算は負荷がかかるため、多くのコンピュータには予め、少数計算用のチップが組み込まれています。 そのチップには、少数は何bitで扱えば速く計算できるというのが決められており、その桁数までしか計算されないので、そのようなことが起こります。(これを丸め誤差といいます) 一応アルゴリズムを考えれば、何桁まででも計算できるのですが、実用的な桁数までで止めているのです。
- FEX2053
- ベストアンサー率37% (7987/21355)
一言でいえば 「0.1は2進数で表現できない」 からです。 2進数は2のn乗の組み合わせで数を表現します。 これが整数なら10のn乗の組み合わせと1対1になるんですが、 小数点以下は2の-n乗=2の1/n乗の組み合わせになります。 すなわち 2の-1乗=1/2=0.5 2の-2乗=1/4=0.25 2の-3乗=1/8=0.125 : これ、どう組み合わせても0.1にならないのは自明ですよね。 0.1と表示してても、0.1でない数字で計算するんですから、 結果がずれるのは当たり前です。 Excelは、そういう一種の「欠陥」と引き換えに、大容量の計算を 一瞬でこなすという「メリット」を得ているんですよ。
- t_ohta
- ベストアンサー率38% (5083/13282)
このあたりを読まれてみるといいかと思います。 http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml
関連するQ&A
- 浮動小数点数型
単精度浮動小数点型と倍精度浮動小数点数型、それぞれ値がとりうる範囲を教えてください。 単精度浮動小数点型 負の値は -3.4028235E+38 ~ -1.401298E-45、 正の値は 1.401298E-45 ~ 3.4028235E+38 の範囲の値 倍精度浮動小数点数型 負の値は -1.79769313486231570E+308 ~ -4.94065645841246544E-324、 正の値は 4.94065645841246544E-324 ~ 1.79769313486231570E+308 の範囲の値 とは記述してあるのですが、実際に小数1桁なら整数部はどのくらいの範囲の値がとれるのか、皆目わかりません。 どうか、わかりやすく教えてください。 よろしくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- 浮動小数点について
当方、浮動小数点を勉強しているのですが、 テキストの解説を読んでも理解が出来ません。 正規化とか指数と仮数の意味が分かりません。 そこで質問なのですが、浮動小数点の計算方法を教えて下さい。 IEEE形式の浮動小数点も教えて頂けると助かります。 また、下記の問題について解説して下さい。 数値を16ビットの浮動小数点表示法で表現する。 形式は図に示す通りである。10進数0.375を正規化した表現は、どれか。 ここでの正規化は、仮数部の有効数字よりも上位の0が無くなるように、 指数部を調節する操作である。 (図は添付します) 何故「E」の値が「1111」になるのでしょうか。 お手数ですが、ご教授お願いします。 尚、特に分かり易いホームページがあったら、 そのURLを記載して頂いても結構です。 以上、よろしくお願い致します。
- ベストアンサー
- その他([技術者向] コンピューター)
- 浮動小数点演算と固定小数点演算の使い分けについて
解説書などには、「浮動小数点は3.14E0の形」や「固定小数点は3.14」などと説明されています。 では、例えば、ごく一般的な32ビットマシンで「3.14 * 45.6」という命令を書いたときに演算されるのは浮動小数点演算なのか、固定小数点演算なのかがわかりません。例えばIntelのx86CPUは、内部にFPUを持っているそうですが、この場合は「3.14 * 45.6」は、内部では必ず浮動小数点演算になっているということなのでしょうか? 「3.14 * 45.6」を「3.14E0 * 4.56E1」と書いた場合にしか浮動小数点演算されないということではないと思っているのですが、実際の浮動小数点演算と固定小数点演算の内部的な切り替えがわかりません。 理解が足りなくて、おかしな質問になっていましたら、その点もご指摘いただければうれしいです。
- ベストアンサー
- その他([技術者向] コンピューター)
- 浮動小数点数って
コンピュータシステムの基礎の本を読んでいるのですが、 浮動小数点数というところが何度読んでもまったくわかりません。 浮動小数点数とは、噛み砕いたらどういうことなのでしょうか。よろしくおねがいします。
- ベストアンサー
- その他(インターネット・Webサービス)
- 『浮動小数点』について
最近、ふと『浮動小数点』について疑問を持ちました。 それは『浮動小数点』がどんな場合に役立つのか?という事です。 C言語では標準で『float』型と『double』型がありますよね。 私は昔、C言語を始めたころにテスト・プログラムなどで使った経験しかなく その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない ことを知りました。『誤差』があることは知っていましたが…。 そこで質問。内容は『浮動小数点』はどんな場面で利用されているかです。 実際の『ソフトウェア開発』や趣味でフリーソフトを作った場合も含み、あと こんな場面で役に立つのではという事を知りたいのです。 アンケートみたいになりますが、『アンケート』カテゴリでは、あまり回答などが 集まらないと思い『C/C++』カテゴリのこちらで質問としました。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 固定小数点と浮動小数点
電算機の小数点認識に固定小数点と浮動小数点というのがあると聞きました。前者は分かるのですが、浮動小数点のWikiとかの記述を見てもあまりピンときませんでした。わかりやすい説明はないでしょうか。
- 締切済み
- オフィス系ソフト
- 浮動小数点について
独学でプログラミングの勉強をしています。Wiki等で調べたりしましたが、 下記テキストの質問の計算が全く分かりません。 分かりやすく説明して頂けるとありがたいです。 宜しくお願い致します。 質問: 二つの浮動小数点の数字があり、SEEMMMM(S=符号付数値、E=指数、M=仮数)の形式で表示されています。 指数はエクセス数50、仮数は符号付数値、小数点は右の仮数に表示されます。 0 53 1110 0 50 3020 二つの数字を加算し、正しく表示された浮動小数点形式と実数をすべての計算式も含め表しなさい。
- 締切済み
- その他([技術者向] コンピューター)
- β進n桁の浮動小数点
2進3桁、ML(絶対値最大の浮動小数点数)=1 MU(絶対値最小の浮動小数点数)=2の浮動小数点数の 体系で表現できる数は全部でいくつか、すべて挙げよ。 また、計算機イプシロンを求めよ。 ・・・っという問題がわからなくて困っています。 どなたか、解法手順またはアドバイスをよろしくお願いします。
- ベストアンサー
- 数学・算数
- さっきの小数点切捨て→浮動小数点数の演算誤差について
さっき、http://oshiete1.goo.ne.jp/kotaeru.php3?q=685942で切捨てがうまくできないっていう質問があって、私は計算機を出してまでなんでやろ~って思って計算して、回答しました。 ところがです、あっさりとそれは浮動小数点数の演算誤差ですっていう答えがすでに出ていたんです。(勉強になりました) うぅぅ~計算機まで出してきて計算した私ってなんてお馬鹿・・・トホホってそれはさておき ここからが質問なんですが、浮動小数点数の演算誤差っていうのはなんとなくは知っていたのですが(本で読んだことはある程度で、もちろん人に説明できるレベルではありませんが)そういうのってどんな場合にでるのでしょう。 さっきの質問の確認のため、Excel2002でオプションの計算のしかたなども変えてみてやったのですが、一度もそういう計算結果はでなかったのですよ。 でも、質問されている方がいるということはそういう計算結果もでるっていうことですよね。なので、どういう場合にそういう結果がでるのかと気になって。 さっきの質問の所に書き込もうかとも思ったのですが、他の方の質問にさらに質問するっていうのは失礼なような気もして、新しく質問しました。 先ほど答えていらっしゃった方でも、他の方でそういうことに詳しい方でもお時間あれば教えていただけないでしょうか。
- ベストアンサー
- オフィス系ソフト