課題で初めてプログラムに取り組んでいるものです。よろしくお願いします。
台形則を使って楕円の面積(の4分の1)を求めるプログラムを作ったのですが、ファンクションで関数を指定するとうまくいきません。
具体的には
func(x)=4.0*sqrt(1.0-x**2.0)
という関数で、0<=x<=1を1000万分割して面積を近似するという課題です。
本来ならfunc(x)は徐々に減少し、x=1で0になるはずが、実際に走らせてみると、それより手前で0になってあとはNaNがでます。
func(x)以外(x座標の分割の仕方等)はうまく行っており(確認済み)、function形式をやめてメインのプログラムに直接式を書き込んだらうまくいきました。
自分ではなんでこんなことが起こるのか皆目見当が付きません。ご教授お願いしますm(_ _)m
No.2ベストアンサー
- 回答日時:
a,bそれぞれを不動小数点数とすると、
a^b = e^(b*log(a))
として計算されます。底はeです。
この計算だけでも、EXP(X)の計算,ALOG(X)の計算,乗算を経由するたびに誤差が積もリます。そのうえ、単精度浮動小数点数と倍精度浮動小数点数の精度の違いで、誤差がいっそう積もりますので、べき計算は"X**2"とすべきでしょう。
関数で計算する場合は、ご自身で倍精度計算に変更してみるのはいかがでしょう。
4.0*sqrt(1.0-x**2.0)
⇒DBLE(4.0)*DSQRT(DBLE(1.0)-X**2)
引数Xは倍精度とします。関数FUNNCも倍精度宣言すれば、メイン側で計算するのと同じ結果が得られるでしょう。
整数以外の結果が出る計算をするときは全ての数を浮動小数点にしなければならないと思っていました(^^;;
誤差というものをもっと学ぶ必要がありますね・・・。
数値の倍精度指定の仕方まで教えてくださって有難うございました!!
No.1
- 回答日時:
課題だと答えを出すのは為にならないので
たぶん、誤差の問題ですね。
何も宣言しないと、XやFUNC、1.0、2.0は単精度になっているはずです。単精度だと、有効数字の範囲が、1000万をフルに表現できるだけありません。
ではどうするかは、ちょっと考えてみてください。
数値計算に取り組むなら、まず、誤差について勉強してみましょう。
なお、余談ですが、べき乗は処理系にもよりますが、X**2.0とX**2、X*Xでは内部の処理が違います、べき数を浮動小数点にすると、一度対数を呼ぶので計算課程が複雑になり、精度、速度が下がることがあります。2乗であれば、x**2かX*Xと書きましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
エクセルで特定のセルのみを任...
-
VBAの再計算が反映されない件に...
-
再帰呼び出しを用いるnPk,nCk ...
-
Excel VBAにてFFT
-
排他的論理和 BCC(水平パリテ...
-
チェス 論理クイズ
-
三菱シーケンサー works2 の日...
-
EXCELなどで「返す」という表現
-
引き放し法による除算アルゴリ...
-
バッチファイルでウインドウを...
-
CとFORTRANの計算速度はどちら...
-
y=(x^2 +3x+1)^4を微分の定義を...
-
変化させるセルが変化しない
-
モジュラス103の計算とは何でし...
-
2つの時間から作業時間を算出...
-
PHPとJavaでSHA256の結果を同じ...
-
CRC8を教えてください
-
骨折リスク評価のFRAXについて...
-
C言語についての質問です。 ル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
EXCELなどで「返す」という表現
-
変化させるセルが変化しない
-
排他的論理和 BCC(水平パリテ...
-
バッチファイルでウインドウを...
-
Visual C++でdebugとreleaseで...
-
モジュラス103の計算とは何でし...
-
ExcelのマクロVBA動作を軽くす...
-
VBAで関数をつくる
-
CとFORTRANの計算速度はどちら...
-
VBAでの勤務時間計算
-
PHPとJavaでSHA256の結果を同じ...
-
傾いた四角形内の範囲の条件式
-
エクセルで特定のセルのみを任...
-
モジュロ
-
継承元と継承先での変数
-
VBでReplace
-
計算量の少ないn乗根の求め方
-
C++ でファイルを消す関数(??)
おすすめ情報