掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
オーバーフローを直すには? (ID:118641)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
# コードを見る限り、明らかに .NETではないので、 # Mathクラスは使えないと思いますよ。>マグさん VB6 や VBA で円周率を得るとすれば、 PI = 4 * Atn(1) が簡単ですね。 もっとも、円周率は変化するような値では無いので、 Constステートメントで定数化しても良いでしょうけど。(^^; さて、本題。 > Dim k, la, theta, c, s, ct, st, nk, r, t, m0, j, m, mk, a1, a2, b1, b2, cx, sx, x, y, z1, fai1, fai, z, v, pre As Integer この宣言だと、最後の pre だけが Integer で、それ以外は全て 「既定のデータ型(初期指定はVariant)」になってしまいますよ。 もし、すべて Integer にしたいなら、 Dim k As Integer, la As Integer という感じで、それぞれに As 句を付けてください。 > Dim l, pi As Integer > l = Int(Log(n) / Log(2) + 0.5) > pi = 3.141592 piは、Integer型で宣言されていますので、整数しか入りません。 上記のコードでは、piの値は 3.141592 ではなく、3 に丸められてしまいますよ。 > fai1という式がどうしてもオーバーフローしてしまいます。 オーバーフローに関しては、どの行でエラーになったのか、そして、 それぞれの変数にどのような値が入っているのかを調べてください。 とりあえず、提示されたコードを実行してみましたが、先頭の > ii = ie - ih の実行時に、ie, ih の両方が、値を未設定(0 のまま)だったので、 結果的に、問題のおきたという下記の fai1 式においても、 > fai1 = (-xr(1) / Abs(xr(1)) * (Atn(xi(1) / z1 / Sqr(1 - xi(1) * xi(1) / z1 / z1)) - pi / 2)) 最終的に、xr(1), xi(1), z1 のすべてが 0 のままとなってしまいました。 (z1が0なので、「〜 / z1」の部分がエラーになり、検証できませんでした) 実際のコードでは、各変数に、きちんと値を代入されているのでしょうが、 第三者にはそれはわかりませんので、エラー発生時の各変数の値を見て、 ご自身で判断してください。 さて、オーバーフローの原因は幾つかありますが、たとえば、 Dim V As Variant Dim D As Double D = 1 / 0 'これは、「0で除算しました」エラーになるが、 V = 0 D = V / 0 'これだと「オーバーフローしました」エラー のように、Variant型の値を 0 で除算したような場合や、 Dim I As Integer Dim J As Integer Dim K As Integer I = 30000 J = 30000 K = I + J 'ここでオーバーフロー など、計算結果がデータ型の範囲(Integer型の最大は32767)を 超えた場合に発生します。 また、演算途中の精度にも気をつけてください。たとえば上記を Dim I As Integer Dim J As Integer Dim K As Long I = 30000 J = 30000 K = I + J のように Integer → Long に変更したとしても、やはり オーバーフローになります。これは、「+」演算において、 「Integer型同士を足した場合、Integerの精度で演算する」ためです。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.