割り算の計算結果を正誤判定したい
-
masa
割り算の計算結果を正誤判定したい
c言語を大学で始めたばかりです。
割り算の答えをキーボードで入力してもらい正誤判定をしたいんですが、答えは四捨五入して小数点第2位までで入力してもらうつもりです。
a=1,b=8とするとc=0.125になり、c=0.13と入力すると正解にしたいんですが、c=0.125を入力しないと正解になりません。どうしたら正解と表示されますか?よろしくお願いします。
実際は他の機能もあり、プログラムの一部分だけ写したので、不足している部分があるかもしれません
割り算の答えをキーボードで入力してもらい正誤判定をしたいんですが、答えは四捨五入して小数点第2位までで入力してもらうつもりです。
a=1,b=8とするとc=0.125になり、c=0.13と入力すると正解にしたいんですが、c=0.125を入力しないと正解になりません。どうしたら正解と表示されますか?よろしくお願いします。
実際は他の機能もあり、プログラムの一部分だけ写したので、不足している部分があるかもしれません
Re: 割り算の計算結果を正誤判定したい
事前に四捨五入した値と比較するといいかもしれません。masa さんが書きました:答えは四捨五入して小数点第2位までで入力してもらうつもりです。
a=1,b=8とするとc=0.125になり、c=0.13と入力すると正解にしたいんですが、c=0.125を入力しないと正解になりません。どうしたら正解と表示されますか?よろしくお願いします。
浮動小数点数の比較は、誤差の影響を受けにくいように「差が十分小さければ等しい」とみなすといいでしょう。
より厳密には、数値ではなく文字列として処理するといいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 割り算の計算結果を正誤判定したい
100.0とだけ書くとdouble型を意味します。
100.0fと書くとfloat型になります。
なお、みけCAT君が書いてる回答の補足です。
round
http://www.c-tipsref.com/reference/math/round.html
fabs
http://www.c-tipsref.com/reference/math/fabs.html
100.0fと書くとfloat型になります。
なお、みけCAT君が書いてる回答の補足です。
round
http://www.c-tipsref.com/reference/math/round.html
fabs
http://www.c-tipsref.com/reference/math/fabs.html
-
masa
Re: 割り算の計算結果を正誤判定したい
doubleはfloatにしたほうがいいんでか?
それと100.0fをかけて100.0fで割るのはどうしてですか?(float)をつけることでfloat型にはできないんですか?
それと100.0fをかけて100.0fで割るのはどうしてですか?(float)をつけることでfloat型にはできないんですか?
Re: 割り算の計算結果を正誤判定したい
しまった、roundはC99でしたか…
round関数を使わずに書きなおしました。
例えば普通の競技プログラミングでメモリが足りなくない時は、精度の高いdoubleやlong doubleを用いたほうがいいでしょう。
DXライブラリを用いるときは、doubleを用いてもfloatの精度で計算されることがあるので互換性を保つためfloatにしたほうがいいと聞いたことがあります。
今回は、最初のコードでfloatが使われていたのでfloatに統一しました。
round関数を使わずに書きなおしました。
#include <stdio.h>
#include <math.h>
float sisyagonyu(float x){
float i,s;
if(x<0.0f)return -sisyagonyu(-x);
i=floor(x);
s=x-i;
return s>=0.5f?i+1.0f:i;
}
int main(void){
float a,b,c,s=0.001;
scanf("%f %f",&a,&b);
scanf("%f",&c);
if(fabs(c-sisyagonyu(a/b*100.0f)/100.0f)<s){
printf("\t正解!\n");
}
else{
printf("\t残念!\n");
}
return 0;
}
場合によります。masa さんが書きました:doubleはfloatにしたほうがいいんでか?
例えば普通の競技プログラミングでメモリが足りなくない時は、精度の高いdoubleやlong doubleを用いたほうがいいでしょう。
DXライブラリを用いるときは、doubleを用いてもfloatの精度で計算されることがあるので互換性を保つためfloatにしたほうがいいと聞いたことがあります。
今回は、最初のコードでfloatが使われていたのでfloatに統一しました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
masa
Re: 割り算の計算結果を正誤判定したい
みけCAT 様もう一度回答してくれてありがとうございます。
他の部分は理解できたのですが
return s>=0.5f?i+1.0f:i;
の部分がどういう意味なのかよくわかりません。
?や:の部分が特にわからないです。
他の部分は理解できたのですが
return s>=0.5f?i+1.0f:i;
の部分がどういう意味なのかよくわかりません。
?や:の部分が特にわからないです。
Re: 割り算の計算結果を正誤判定したい
これは三項演算子です。masa さんが書きました: return s>=0.5f?i+1.0f:i;
の部分がどういう意味なのかよくわかりません。
?や:の部分が特にわからないです。
s>=0.5fが真ならi+1.0f、偽ならiという意味です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
masa
Re: 割り算の計算結果を正誤判定したい
回答ありがとうございます。理解できました。
今、実行してみたところ
/tmp/cclypd6i.o: In function `sisyagonyu':
test.c:(.text+0x46): undefined reference to `floor'
collect2: ld はステータス 1 で終了しました
と表示されました。
どうしてでしょうか?
今、実行してみたところ
/tmp/cclypd6i.o: In function `sisyagonyu':
test.c:(.text+0x46): undefined reference to `floor'
collect2: ld はステータス 1 で終了しました
と表示されました。
どうしてでしょうか?
Re: 割り算の計算結果を正誤判定したい
標準でリンクされるライブラリにfloorの実体が無かったからでしょう。masa さんが書きました:今、実行してみたところ
/tmp/cclypd6i.o: In function `sisyagonyu':
test.c:(.text+0x46): undefined reference to `floor'
collect2: ld はステータス 1 で終了しました
と表示されました。
どうしてでしょうか?
コンパイルオプションに-lmを追加してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)