いま公式から円周率を求めるというプログラムを作っているんですが
結果を求める過程で、変数を変化させて、その変化させた数値を使って
公式にあてはめていくというものなのですが
結果を見る限り、変数が変化していないような結果になってしまいます。
コードは
Private Sub Command1_Click()
'変数の宣言
Dim A As Single
Dim B As Single
Dim T As Single
Dim X As Single
Dim Y As Single
Dim π As Single
'初期値設定
A = 1
B = 1 / Sqr(2) * 2
T = 1 / 4
X = 1
'A-Bが小数第7桁までいくか確認
If (A - B) < 0.000001 Then
'満たした場合
π = (A + B) ^ 2 / 4 * T
txtAns = π
'満たさなかった場合
Else
'ガウス公式で計算開始
Y = A
A = (A + B) / 2
B = Sqr(2) * B * Y
T = T - X * (Y - A) ^ 2
X = 2 * X
'確認2
If (A - B) < 0.000001 Then
'満たした場合
π = (A + B) ^ 2 / 4 * T
txtAns = π
'満たさなかった場合以下同じものが続く
と、わかりづらいかもしれませんが、公式に変数をあてはめて
A-Bの値が、0.000001以下になったときに、πを求める式にしたつもりです。
ですが、実際は0.000001以下になる前にπを求める式にいってる気がします。
自分的には変数を変化させられてないのかな?と思うのですが
ここが違う、などご指摘ありましたらご教授お願いします。
>ですが、実際は0.000001以下になる前にπを求める式にいってる気がします。
気がします。。。ではアレなので、
ブレークポイントを
If (A - B) < 0.000001 Then
の箇所に追いて、イミディエイトウィンドウ、もしくは
ウォッチ式でAの値、Bの値、A-Bの値をちゃんと確認しましょ
アドバイスありがとうございます><
のあ・・A=1 B=1.414 でA-Bがマイナスです・・。
これじゃあ、最初のIfでπがでちゃいますね・・
sqr(2)*2 の部分が怪しいので確認してきます!
もし、AとBの単純に差を撮りたいのであれば、
絶対値(ABS関数)を使用してみるというのも一つの手ですが・・・。
If ABS(A - B) < 0.000001 Then
ありがとうございます!
AとBについては完璧になりました!
色々ウォッチで、部分部分の数値を見ていったんですが
どうやら Y = A が問題のようです・・。
説明しづらいのですが、コードは上から順に認識されていくものだと思い
A = (A + B) / 2
B = Sqr(B * Y)
T = T - X * (Y - A) ^ 2
X = 2 * X
Y = A
と、したのですが 一番下にある Y = A のYの値が上のBやTの式に
はいっていってしまってるようなのです。
たとえばここが確認3のあとの、変数変更のコードだとしたら
確認2で出た、Aの値をYにいれたいのです。
色々試行錯誤してみたのですがうまくいかず・・
もし方法があったら教えてください、お願いします。
ああ・・問題はそこではなかったみたいです;
Private Sub Command1_Click()
'変数の宣言
Dim A As Single
Dim B As Single
Dim T As Single
Dim X As Single
Dim Y As Single
Dim π As Single
'初期値設定
A = 1
B = 1 / Sqr(2)
T = 1 / 4
X = 1
Y = A
'A-Bが小数第7桁までいくか確認
If Abs(A - B) < 0.000001 Then
'満たした場合
π = (A + B) ^ 2 / 4 * T
txtAns = π
'満たさなかった場合
Else
'ガウス公式で計算開始
Y = A
A = (A + B) / 2
B = Sqr(B * Y)
T = T - X * (Y - A) ^ 2
X = 2 * X
'確認2
If Abs(A - B) < 0.000001 Then
'満たした場合
π = (A + B) ^ 2 / 4 * T
txtAns = π
'満たさなかった場合
Else
'ガウス公式で計算開始
Y = A
A = (A + B) / 2
B = Sqr(B * Y)
T = T - X * (Y - A) ^ 2
X = 2 * X
'確認3
If Abs(A - B) < 0.000001 Then
'満たした場合
π = (A + B) ^ 2 / 4 * T
txtAns = π
'満たさなかった場合
Else
'ガウス公式で計算開始
Y = A
A = (A + B) / 2
B = Sqr(B * Y)
T = T - X * (Y - A) ^ 2
X = 2 * X
'確認4
If Abs(A - B) < 0.000001 Then
'満たした場合
π = (A + B) ^ 2 / 4 * T
txtAns = π
'満たさなかった場合
Else
'ガウス公式で計算開始
Y = A
A = (A + B) / 2
B = Sqr(B * Y)
T = T - X * (Y - A) ^ 2
X = 2 * X
End If
End If
End If
End If
End Sub
で、最後のIfで条件を満たし、ウォッチでは3.14〜と答えがでる数値でした。
ですが、πは0.16となっているので、細かいミスだと思います。
少し自力でやってみます!
同じ計算を繰り返すなら
'初期値設定
.
.
.
Do While Abs(A - B) > 0.000001
’計算処理
.
.
.
Loop
’条件を満たしたときの計算式
.
.
.
という書き方をした方がいいですね。
必ず4回で解がでるならいいですが。
はい!自分も丁度そう思い、書き直していました!
ありがとうございますm(_)m
いまだに答えが0.16399だぁ・・くそぉ><
Private Sub Command1_Click()
'変数の宣言
Dim A As Double
Dim B As Double
Dim T As Double
Dim X As Double
Dim Y As Double
Dim PI As Double
'初期値設定
A = 1
B = 1 / Sqr(2)
T = 1 / 4
X = 1
Y = A
'A-Bが小数第7桁までいくか確認
Do Until Abs(A - B) < 0.0000001
'ガウス公式で計算開始
Y = A
A = (A + B) / 2
B = Sqr(B * Y)
T = T - X * (Y - A) ^ 2
X = 2 * X
Loop
'満たした場合
PI = (A + B) ^ 2 / (4 * T)
txtAns = PI
End Sub
にて解決いたしました!
PI = (A + B) ^ 2 / (4 * T)
の、4 * Tに()が抜けていたために計算結果が違ってきてたようです!
質問に答えてくれた方々本当にありがとうございましたm(_)m
おめでとう
ツイート | ![]() |