アプリ版:「スタンプのみでお礼する」機能のリリースについて

double a;
double b;
と宣言し、a、bを演算した結果、
if(a==b)とするのはa、bには多少の誤差があるため
使い方が間違っているのはわかりますが、
どういう仕組みで異なるのでしょうか。

double a=0.0と宣言し、
途中a=2.0と代入を行った場合も
if(a==2.0)は使用方法が間違っているのでしょうか?
どういうときに誤差がでて、どういうときは大丈夫なのでしょうか?

A 回答 (2件)

> どういう仕組みで異なるのでしょうか。



有限精度で表現するために、割り切れない数や無理数などでは当然誤差が出ます。これは、普通に紙の上で10進数で計算した場合でも同じことがいえます。(どこで、どう丸めるかの差です)

> double a=0.0と宣言し、
> 途中a=2.0と代入を行った場合も
> if(a==2.0)は使用方法が間違っているのでしょうか?

いいえ、間違っていません。
一致するかどうかの判定には等価演算子を使うのが基本です。演算結果に誤差が出るのは事実ですが、何をもって等しいとするかは状況次第ですので、常に最適な方法があるわけではありません。

数学や理科で有効桁数というのを習ったと思います。現実に扱うほとんどの実数値は、計算誤差以前に元の値自体が測定誤差を含んでいます。それを無視して計算誤差だけに配慮しても無意味です。
    • good
    • 0

問題になるのは「対象とする環境で正確に表現できない値を使う」場合です. まあ, 「正確に表現できる値しか使わない」場合に問題にならないのは当然ですが.


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

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

お礼日時:2007/05/30 23:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!