ページ 1 / 1
自作関数内のif文について
Posted: 2014年6月09日(月) 23:57
by りんごさん
f(x)= x^2-10x-10(-5≦x≦15),-x^2+10x+140(x<-5,x>15)
整数a=-100から100のうちf(a)>0のみを画面表示するプログラムを作成せよ
-100から100まですべてのaについて試行し判定すること。
関数f(x)の値をかえす自作関数を作成すること。
という問題に対して下記のようなプログラムを考えたのですが、if文のif(a >= -5 && a <= 15)が機能していなく、すべてのaについて両方の関数に代入し値を算出してしまいます。
どのように改善したらよいのか教えて頂けたら幸いです。
コード:
#include <stdio.h>
float my_func(float x );
int main (void)
{
float a,b;
for(a=-100;a<101;a++){
b=my_func(a);
if(b > 0){
printf("%f \n",b);
}
}
return 0;
}
float my_func(float x )
{
float a;
if(a >= -5 && a <= 15)
return (x*x-10*x-10);
else
return (-x*x+10*x+140);}
Re: 自作関数内のif文について
Posted: 2014年6月10日(火) 00:09
by みけCAT
りんごさん さんが書きました:if文のif(a >= -5 && a <= 15)が機能していなく、すべてのaについて両方の関数に代入し値を算出してしまいます。
「すべてのaについて両方の関数に代入し値を算出してしまう」ようなコードには見えません。
本当にデバッガなどで両方の関数に代入しているように見えましたか?
それと、該当のif文を実行する時点で、aの値は不定です。
りんごさん さんが書きました:どのように改善したらよいのか教えて頂けたら幸いです。
該当のif文のaを両方xに変えればいいと思います。
Re: 自作関数内のif文について
Posted: 2014年6月10日(火) 00:19
by りんごさん
早い回答本当にありがとうございます!!
a→xにしたところ無事に改善されました。
デバッグなどで調べた訳ではないのですが表示された計算結果が
あまりにも大きすぎるため手計算で確かめたところ
両方の関数に範囲が関係なく-100から100の値が代入されていました
Re: 自作関数内のif文について
Posted: 2014年6月10日(火) 00:27
by box
float型を使う必要が本当にあるでしょうか?
float型を++でインクリメントして本当にいいのかどうか、よくわかりません。
int系の変数に対してならば普通のことですけれど。
-100 ≦ a ≦ 100 であるならば、
for文は101未満と書くよりも、100以下と書く方が素直ではないでしょうか。まあ、どっちでも同じですけど。
Re: 自作関数内のif文について
Posted: 2014年6月10日(火) 01:31
by きゃりーわんわん
box さんが書きました:
float型を++でインクリメントして本当にいいのかどうか、よくわかりません。
int系の変数に対してならば普通のことですけれど。
調べてみると、過去ログがヒットしました。
どうやら大丈夫とのことです。
http://dixq.net/forum/viewtopic.php?f=3&t=9447
Re: 自作関数内のif文について
Posted: 2014年6月10日(火) 08:12
by box
仮に、float型のような浮動小数点数を
++
でインクリメントしてよいとしても、
浮動小数点数の誤差により、例えば
99.0をインクリメントした結果が
「ちょうど」100.0にならない結果、
ループの実行回数がちょうど201回にならなかったりして…。
int系の変数ではそういうことは起きない(はず)ですね。
まあ、int系を使うのが無難かと。
Re: 自作関数内のif文について
Posted: 2014年6月10日(火) 14:11
by YuO
box さんが書きました:仮に、float型のような浮動小数点数を
++
でインクリメントしてよいとしても、
浮動小数点数の誤差により、例えば
99.0をインクリメントした結果が
「ちょうど」100.0にならない結果、
ループの実行回数がちょうど201回にならなかったりして…。
ある程度小さい範囲では,浮動小数点数型を使って整数演算をしても誤差は発生しません。
まず,Cの浮動小数点数型のモデルが,整数±1を正確に表せることを保証しています。
ISO/IEC 9899:1999のモデルx=sb
eΣ
k=1p f
kb
-kにおいて,s = 1, e = 1, f
1 = 1, f
k|k≠1 = 0,とすれば,x=sb
ef
1b
-1なので誤差無く1が表せます。
あとは,その整数倍ですから,eを増やしてkをf
1からf
eを,f
1を上位桁として並べれば,そのまま整数が正しく表現できます。
どこかのタイミングで,x + 1.0f == xとなるのですが,高々100程度であれば通常問題ないです。
box さんが書きました:int系の変数ではそういうことは起きない(はず)ですね。
まあ、int系を使うのが無難かと。
ループ変数にintを使うのが無難なのは同意します。
浮動小数点数型は通常効率が悪すぎるのと,うっかり刻みを小数にしてしまって誤差に泣く可能性がありますので。
Re: 自作関数内のif文について
Posted: 2014年6月10日(火) 14:19
by box
for文の制御変数にfloat型(などの浮動小数点数)を使うのは、
個人的にひじょうに気持ちが悪いと思っている、ということです。
私なら、「絶対に」しません。仮にfloatでうまくいくことがわかっているとしても。