変数を変化させるには?

解決


肌水  2005-09-05 22:38:41  No: 124880

いま公式から円周率を求めるというプログラムを作っているんですが
結果を求める過程で、変数を変化させて、その変化させた数値を使って
公式にあてはめていくというものなのですが
結果を見る限り、変数が変化していないような結果になってしまいます。
コードは

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以下になる前にπを求める式にいってる気がします。

自分的には変数を変化させられてないのかな?と思うのですが
ここが違う、などご指摘ありましたらご教授お願いします。


いな  2005-09-05 22:46:38  No: 124881

>ですが、実際は0.000001以下になる前にπを求める式にいってる気がします。

気がします。。。ではアレなので、
ブレークポイントを
    If (A - B) < 0.000001 Then
の箇所に追いて、イミディエイトウィンドウ、もしくは
ウォッチ式でAの値、Bの値、A-Bの値をちゃんと確認しましょ


肌水  2005-09-05 23:04:31  No: 124882

アドバイスありがとうございます><

のあ・・A=1  B=1.414  でA-Bがマイナスです・・。
これじゃあ、最初のIfでπがでちゃいますね・・
sqr(2)*2  の部分が怪しいので確認してきます!


いな  2005-09-05 23:13:09  No: 124883

もし、AとBの単純に差を撮りたいのであれば、
絶対値(ABS関数)を使用してみるというのも一つの手ですが・・・。

If ABS(A - B) < 0.000001 Then


肌水  2005-09-05 23:47:20  No: 124884

ありがとうございます!
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にいれたいのです。
色々試行錯誤してみたのですがうまくいかず・・
もし方法があったら教えてください、お願いします。


肌水  2005-09-06 00:03:00  No: 124885

ああ・・問題はそこではなかったみたいです;

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となっているので、細かいミスだと思います。
少し自力でやってみます!


9566  2005-09-06 00:16:30  No: 124886

同じ計算を繰り返すなら

'初期値設定
  .
  .
  .
Do While Abs(A - B) > 0.000001
  ’計算処理
  .
  .
  .
Loop

’条件を満たしたときの計算式
  .
  .
  .

という書き方をした方がいいですね。
必ず4回で解がでるならいいですが。


肌水  2005-09-06 00:21:44  No: 124887

はい!自分も丁度そう思い、書き直していました!
ありがとうございますm(_)m
いまだに答えが0.16399だぁ・・くそぉ><


肌水  2005-09-06 00:37:28  No: 124888

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


いな  2005-09-06 01:16:37  No: 124889

おめでとう


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加