• ベストアンサー

double型の比較・キャストについて

double a; double b; と宣言し、a、bを演算した結果、 if(a==b)とするのはa、bには多少の誤差があるため 使い方が間違っているのはわかりますが、 どういう仕組みで異なるのでしょうか。 double a=0.0と宣言し、 途中a=2.0と代入を行った場合も if(a==2.0)は使用方法が間違っているのでしょうか? どういうときに誤差がでて、どういうときは大丈夫なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> どういう仕組みで異なるのでしょうか。 有限精度で表現するために、割り切れない数や無理数などでは当然誤差が出ます。これは、普通に紙の上で10進数で計算した場合でも同じことがいえます。(どこで、どう丸めるかの差です) > double a=0.0と宣言し、 > 途中a=2.0と代入を行った場合も > if(a==2.0)は使用方法が間違っているのでしょうか? いいえ、間違っていません。 一致するかどうかの判定には等価演算子を使うのが基本です。演算結果に誤差が出るのは事実ですが、何をもって等しいとするかは状況次第ですので、常に最適な方法があるわけではありません。 数学や理科で有効桁数というのを習ったと思います。現実に扱うほとんどの実数値は、計算誤差以前に元の値自体が測定誤差を含んでいます。それを無視して計算誤差だけに配慮しても無意味です。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

問題になるのは「対象とする環境で正確に表現できない値を使う」場合です. まあ, 「正確に表現できる値しか使わない」場合に問題にならないのは当然ですが. 例えば, 有効数字部を 2進数で表現する (普通の) 環境を考えてみましょう. この環境において, 2.0 は正確に表現できるので == で比較しても問題ありません. しかし, n/10 は n % 5 != 0 のときには正確に表現できないので, 0.1 + 0.9 == 1.0 かどうかはわかりません. もっといえば, 0.1 * 10 == 1.0 かどうかもわからなかったりします.

noname#57479
質問者

お礼

ご回答ありがとうございます。 例えば、double a = 3と宣言した場合、 丸め誤差が発生していて、 if(a==3)の条件文に入れたい場合入らないのでしょうか? あるいはif(a==3.0)と右辺をdouble型にすればよろしいのでしょうか? (int)aでキャストするともしかしたらa=2.99999999・・・の場合、 (int)a=2となってしまい条件文に入らないと思います。 どうするのがベストなのでしょうか?

関連するQ&A