ページ 11

C言語の課題で…

Posted: 2007年7月06日(金) 05:27
by 大学生
現在出されている課題なんですが、虚数解の出力の仕方が思い浮かびません。アドバイスお願いします。
以下途中まで作成したプログラムです。
課題

Re:大学生

Posted: 2007年7月06日(金) 05:29
by 大学生
名前とタイトル逆にしてしまいました…

Re:大学生

Posted: 2007年7月06日(金) 11:21
by 管理人
名前とタイトルについては修正しておきました☆
コードはなるべく字下げしたものを使用してください^^;
<pre>タグと</pre>タグで囲めば字下げされたまま投稿できます。
タグは全て半角で書いてください。

質問についてですが、計算式がわからないのでしょうか?
もし数学的なことでしたら、
http://www.google.co.jp/search?q=%E8%A4 ... C%8F&hl=ja
こちらなど参考にしてください。

Re:大学生

Posted: 2007年7月06日(金) 20:20
by 組木紙織
細かいことですが、係数はdouble型なのに、判別式Dがfloatなのが気になります。
キャストをしているところがありますが、型をそろえておけばこのキャストは不必要です。

浮動点小数型を等号を使って比較しているのも気になります。
誤差が入ってくるので、浮動点小数型では数学的には正しくても、実行したら正しくないということが
よくあります。
fabs(D)<0.1
のようなことして、誤差の範囲で0と見做すということをよく使います。

>虚数解
虚数解は実数部と虚数部に分けて考えてあげれば計算できます。
分け方さえ思いつけば後はそんなに難しくありません。

Re:大学生

Posted: 2007年7月06日(金) 20:32
by box
> 浮動点小数型を等号を使って比較しているのも気になります。

丸め誤差の影響で、判別式の値が、例えば0.0000001なんていう、
ゼロに非常に近いけれどちょうどゼロではないという状態のとき、
本当は重解であるところプログラム上はそうならないことが
起こりえますね。

同じ理由で、本当は2つの解を持つのだけれどプログラム上は
重解とみなすことがあるかもしれません。

というわけで、判別式の値をゼロと比較すること自体は
特に問題ないと思います。

Re:大学生

Posted: 2007年7月06日(金) 23:35
by 大学生
みなさん、アドバイスありがとうございます。参考にしてプログラム修正しました。
これなら、問題ないでしょうか?(家にC言語の環境がないので、動作確認はまだしていません。)

Re:大学生

Posted: 2007年7月07日(土) 00:50
by box
>       D=b*b-4*a*c; 
>       A=-b/( 2 * a );
>       B=sqrt(-D)/( 2 * a );

Dの正負がわかっていないのに、決めうちでsqrt(-D)とするのはまずいです。
このコードでは、もしDが正だったら負数の平方根を求めようとしますので、
正しい結果を得ません。

Re:大学生

Posted: 2007年7月07日(土) 01:26
by 大学生
なるほど確かにそうですね…
A=-b/(2*a)  B=sqrt(-D)/(2*a)の場所を変えてみました。
これでもダメでしょうか…?

Re:大学生

Posted: 2007年7月07日(土) 11:20
by 組木紙織
>同じ理由で、本当は2つの解を持つのだけれどプログラム上は
>重解とみなすことがあるかもしれません。

可能性としては、ありうるとは思いますが、実際問題としては、
数学的には同じであるが、プログラム上では異なるという場合のほうが圧倒的に多いので、

浮動点小数を扱うときには等号は、
同じであるとする範囲をどれくらいにすべきかという問題もあるのですが、
使うべきではないと思っています。

この場合は普通の数字の範囲では十分等号で判定できると思いますが、
気にしていないと不自然な結果がでたときに、困るので、書き込みをしました。


>これでもダメでしょうか…?
>scanf("%f",&a);
をscnaf("%lf",&a);
にすることぐらいでしょうか。
aの型はdoubleですので。

実際に動かしてみるのが一番なのですが、家に環境が無いのなら仕方ないですね。
調べてみたら無料で手に入るので家に環境を用意してみるといいと思います。

Re:大学生

Posted: 2007年7月10日(火) 02:36
by 大学生
おかげさまで完成しました。
ありがとうございました。