ページ 11

float BMI = 19.8 なのに、BMI < 19.8がTrueとなる

Posted: 2013年10月19日(土) 21:15
by AI
タイトルのままです。
BMIを算出するプログラムを書いています。
計算して算出したBMIを元に、if文でそれぞれのBMIが
やせ~肥満のどこに分類されるかの部分を書いています。
身長=100、体重=19.8で算出したBMI(float)が19.8となりますが、
if (BMI<19.8){}の中に入ってきてしまうのです。
19.8って、19.8未満じゃありませんよね?
混乱してしまっていておかしなことを言っているかもしれません。
すごく当たり前のことだったらすみません
どうしたら19.8を「<19.8」の中に入れずにすみますか?
それとも、19.8という数値は「<19.8」ですか?
ご教授お願い致します。

Re: float BMI = 19.8 なのに、BMI < 19.8がTrueとなる

Posted: 2013年10月19日(土) 21:22
by softya(ソフト屋)
表示の仕方によっては四捨五入された19.8かも知れません。つまり、19.75でも19.8と表示されてしまう状況は考えられます。
そうするとif (BMI<19.8)の条件を満たす可能性は有ります。

Re: float BMI = 19.8 なのに、BMI < 19.8がTrueとなる

Posted: 2013年10月19日(土) 21:25
by h2so5
リテラルにfを付けないで比較しているからではないでしょうか。

コード:

#include <stdio.h>
 
int main(void) {
	float BMI = 19.8f;
 
	if (BMI < 19.8f) {
		printf("BMI < 19.8f");
	}
 
	if (BMI < 19.8) {
		printf("BMI < 19.8");
	}
 
	return 0;
}
実行結果
http://ideone.com/Ww7hO2

Re: float BMI = 19.8 なのに、BMI < 19.8がTrueとなる

Posted: 2013年10月19日(土) 21:27
by AI
お返事ありがとうございます。
途中で処理を止めて見てみたのですが、
こんなかんじでした。
画像
これでも条件を満たす可能性があるでしょうか?
すみませんがお返事お願い致します。

Re: float BMI = 19.8 なのに、BMI < 19.8がTrueとなる

Posted: 2013年10月19日(土) 21:28
by みけCAT
(競技プログラミングでの)実数の比較では、EPSと呼ばれる小さい値を用いて誤差による判定エラーを回避することが多いです。

コード:

#define EPS (1e-7)

float BMI=19.8f;

if(BMI+EPS<19.8f) {
    /* BMI<19.8 */
}
if(BMI<19.8f+EPS) {
    /* BMI<=19.8 */
}

Re: float BMI = 19.8 なのに、BMI < 19.8がTrueとなる

Posted: 2013年10月19日(土) 21:29
by softya(ソフト屋)
この場合は、h2so5さんの指摘の可能性が高いでしょう。

Re: float BMI = 19.8 なのに、BMI < 19.8がTrueとなる

Posted: 2013年10月19日(土) 21:30
by AI
>>h2so5さん
すみません!できました!
リテラルというものを知りませんでした、今すぐ調べます!
頭がパニックになって、19.8は実は19.8未満なのかもしれないなどと思っておりました!
助けていただいて本当に有難うございます!!

Re: float BMI = 19.8 なのに、BMI < 19.8がTrueとなる

Posted: 2013年10月19日(土) 21:30
by AI
>>みけCATさん
ありがとうございました!
その数字についても調べます!!