![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
課題で初めてプログラムに取り組んでいるものです。よろしくお願いします。
台形則を使って楕円の面積(の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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 大学一年でVBAのプログラミングを勉強しているものです。来週の情報の授業で以下の問題のプログラムを勉 4 2023/01/19 16:15
- その他(プログラミング・Web制作) パイソンのプログラミングについての質問です 2 2023/05/22 12:39
- Visual Basic(VBA) VBAプログラム初心者です。 以下の問題のプログラムを表記してみたのですが、実行するためには、どこを 4 2023/01/19 20:04
- その他(プログラミング・Web制作) 大学のゼミのレポートがムカつきます。 R言語というデータ分析に特化したプログラム言語を用いた授業の課 1 2023/06/29 00:50
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 物理学 歌口と楕円形の太鼓 1 2023/05/15 23:21
- その他(プログラミング・Web制作) VBA 1 2023/01/19 16:19
- 中学校 中1数学 比例のグラフの座標の読み取り 4 2023/03/28 12:26
- 中学校 学校の夏休みの課題で『SDGsについて考えよう!』 という課題があります。 そして、SDGsの17の 6 2022/08/20 12:18
- 中学校 学校の夏休みの課題で『SDGsについて考えよう!』 という課題があります。 そして、SDGsの17の 2 2022/08/19 21:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBでReplace
-
Visual C++でdebugとreleaseで...
-
計算量の少ないn乗根の求め方
-
アドオン利率を実質年率に変換
-
エクセル以外で麻雀の成績を管...
-
再帰呼び出しの計算量
-
エクセルで特定のセルのみを任...
-
EXCELなどで「返す」という表現
-
Java 電卓の連続計算
-
先行評価と遅延評価
-
排他的論理和 BCC(水平パリテ...
-
最適円順列を求めるアルゴリズ...
-
VBA 九九 Do While
-
VBAで一時的にオーバーフローを...
-
モジュラス103の計算とは何でし...
-
Delphiでバッチ処理を直ぐに書...
-
計算機はなぜ計算間違いをしないか
-
骨折リスク評価のFRAXについて...
-
タクシー料金の問題です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
変化させるセルが変化しない
-
排他的論理和 BCC(水平パリテ...
-
VBAの再計算が反映されない件に...
-
VBAで関数をつくる
-
モジュラス103の計算とは何でし...
-
バッチファイルでウインドウを...
-
EXCELなどで「返す」という表現
-
数値計算の高速化 (cos, sin, exp)
-
傾いた四角形内の範囲の条件式
-
骨折リスク評価のFRAXについて...
-
Excel VBAにてFFT
-
matlab計算での進捗状況を知りたい
-
C言語についてです。 再帰を使...
-
C言語について 下の画像は do-w...
-
アドオン利率を実質年率に変換
-
エクセルで特定のセルのみを任...
-
電卓でmodの計算
-
y=(x^2 +3x+1)^4を微分の定義を...
-
「評価」「評価値」という言葉...
おすすめ情報