自作関数内のif文について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
りんごさん

自作関数内のif文について

#1

投稿記事 by りんごさん » 11年前

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);}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 自作関数内のif文について

#2

投稿記事 by みけCAT » 11年前

りんごさん さんが書きました:if文のif(a >= -5 && a <= 15)が機能していなく、すべてのaについて両方の関数に代入し値を算出してしまいます。
「すべてのaについて両方の関数に代入し値を算出してしまう」ようなコードには見えません。
本当にデバッガなどで両方の関数に代入しているように見えましたか?
それと、該当のif文を実行する時点で、aの値は不定です。
りんごさん さんが書きました:どのように改善したらよいのか教えて頂けたら幸いです。
該当のif文のaを両方xに変えればいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

りんごさん

Re: 自作関数内のif文について

#3

投稿記事 by りんごさん » 11年前

早い回答本当にありがとうございます!!
a→xにしたところ無事に改善されました。

デバッグなどで調べた訳ではないのですが表示された計算結果が
あまりにも大きすぎるため手計算で確かめたところ
両方の関数に範囲が関係なく-100から100の値が代入されていました

box
記事: 2002
登録日時: 14年前

Re: 自作関数内のif文について

#4

投稿記事 by box » 11年前

float型を使う必要が本当にあるでしょうか?

float型を++でインクリメントして本当にいいのかどうか、よくわかりません。
int系の変数に対してならば普通のことですけれど。

-100 ≦ a ≦ 100 であるならば、
for文は101未満と書くよりも、100以下と書く方が素直ではないでしょうか。まあ、どっちでも同じですけど。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

きゃりーわんわん
記事: 34
登録日時: 12年前

Re: 自作関数内のif文について

#5

投稿記事 by きゃりーわんわん » 11年前

box さんが書きました: float型を++でインクリメントして本当にいいのかどうか、よくわかりません。
int系の変数に対してならば普通のことですけれど。
調べてみると、過去ログがヒットしました。
どうやら大丈夫とのことです。
http://dixq.net/forum/viewtopic.php?f=3&t=9447

box
記事: 2002
登録日時: 14年前

Re: 自作関数内のif文について

#6

投稿記事 by box » 11年前

仮に、float型のような浮動小数点数を
++
でインクリメントしてよいとしても、
浮動小数点数の誤差により、例えば
99.0をインクリメントした結果が
「ちょうど」100.0にならない結果、
ループの実行回数がちょうど201回にならなかったりして…。
int系の変数ではそういうことは起きない(はず)ですね。
まあ、int系を使うのが無難かと。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: 自作関数内のif文について

#7

投稿記事 by YuO » 11年前

box さんが書きました:仮に、float型のような浮動小数点数を
++
でインクリメントしてよいとしても、
浮動小数点数の誤差により、例えば
99.0をインクリメントした結果が
「ちょうど」100.0にならない結果、
ループの実行回数がちょうど201回にならなかったりして…。
ある程度小さい範囲では,浮動小数点数型を使って整数演算をしても誤差は発生しません。

まず,Cの浮動小数点数型のモデルが,整数±1を正確に表せることを保証しています。
ISO/IEC 9899:1999のモデルx=sbeΣk=1p fkb-kにおいて,s = 1, e = 1, f1 = 1, fk|k≠1 = 0,とすれば,x=sbef1b-1なので誤差無く1が表せます。
あとは,その整数倍ですから,eを増やしてkをf1からfeを,f1を上位桁として並べれば,そのまま整数が正しく表現できます。

どこかのタイミングで,x + 1.0f == xとなるのですが,高々100程度であれば通常問題ないです。
box さんが書きました:int系の変数ではそういうことは起きない(はず)ですね。
まあ、int系を使うのが無難かと。
ループ変数にintを使うのが無難なのは同意します。
浮動小数点数型は通常効率が悪すぎるのと,うっかり刻みを小数にしてしまって誤差に泣く可能性がありますので。

box
記事: 2002
登録日時: 14年前

Re: 自作関数内のif文について

#8

投稿記事 by box » 11年前

for文の制御変数にfloat型(などの浮動小数点数)を使うのは、
個人的にひじょうに気持ちが悪いと思っている、ということです。
私なら、「絶対に」しません。仮にfloatでうまくいくことがわかっているとしても。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る