C言語関係掲示板

過去ログ

No722 浮動小数点数の比較演算

[戻る] [ホームページ]
No.8772

浮動小数点数の演算の出力結果の違いについてなんですが・・
投稿者---ろびん(2003/08/03 15:52:15)
http://abc


題名の通りなんですが、以下のプログラムでelse文の方が実行されてしまうので、if文の方を実行させるにはどうすればいいのかという課題なんですが、C言語初心者の自分には全くわかりません・・。実際、f1とf2を求めてみたのですが、f1=23.333334とf2=23.333332という結果になりました。どうして、こうなるのかわかりません。どなたか、おしえて下さい。お願いします!!


main()
{ float f1,f2,a,b,c,d;

a=700000.0;
b=30000.0;

c=7.0;
d=0.3;

f1=a/b;
f2=c/d;

if(f1==f2)
{ printf("f1 == f2\n");}

else
{ printf("f1 != f2\n");}
}

No.8777

Re:浮動小数点数の演算の出力結果の違いについてなんですが・・
投稿者---くけ(2003/08/03 18:04:32)


不動小数点の比較演算をしている時点で、課題に対する答えは不可能です。
(不動小数点は近似値しか持ち得ないため、厳密な比較をすることはできません。)
模範解答としては ”不動小数点の比較演算のため不可能” ですかね?
近似値での比較でよろしければ、f1とf2を比較演算の部分で、それぞれ int 等にキャストするいいでしょう。
それでダメでしたら、課題の提出者に抗議しましょう。Cの書籍に書かれているのであれば、それは捨ててかまいません。

>f1=23.333334とf2=23.333332という結果になりました。
無限に続く数を有限で表現するため、"丸め"が発生した結果です。
f1=a/b; f2=c/d; では、計算の精度が違うため、このような結果になります。
オリジナルのソースでも計算精度が等しければ if(f1==f2) は通る"かも"知れません。

No.8779

Re:浮動小数点数の演算の出力結果の違いについてなんですが・・
投稿者---さん(2003/08/03 19:58:27)


>以下のプログラムでelse文の方が実行されてしまうので、if文の方を実行させるには
>どうすればいいのかという課題なんですが

floatのまま比較をする場合は、「f1とf2の差が十分小さな値である場合は一致していると見なす」、という取り決めをすることで解決します。これは数値演算の基礎です。

#include <stdio.h>
#include <math.h>

#define     E       0.00001

main()
{
    float f1,f2,a,b,c,d;

    a = 700000.0;
    b = 30000.0;
    c = 7.0;
    d = 0.3;

    f1 = a / b;
    f2 = c / d;

    if (fabs(f1 - f2) <= E){printf("f1 == f2\n");}
    else{printf("f1 != f2\n");}
}




No.8785

Re:浮動小数点数の演算の出力結果の違いについてなんですが・・
投稿者---ろびん(2003/08/03 22:44:10)


詳しいご返答ありがとうございます!!
数値演算って結構奥が深いですね。
基礎的な所をもう一度見直してみます。
ありがとうございました。