C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: Loop文で絶対値の範囲になれば抜けるコード


(過去ログ 114 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■67428 / inTopicNo.1)  Loop文で絶対値の範囲になれば抜けるコード
  
□投稿者/ ブレンド (1回)-(2013/08/01(Thu) 22:07:54)

分類:[VB.NET/VB2005 以降] 

VB2010で以下のようなコードを書きました。

        Do Until Math.Abs(ΔQ) < 0.001

これが、ΔQが−0.001〜0.001の範囲になっても、Loopを抜けてくれません。

        Do Until ΔQ < 0.001

と書くと大丈夫なのですが、ΔQ > -0.001になっても抜けてほしいのです。

解決策があれば教えてください。

引用返信 編集キー/
■67430 / inTopicNo.2)  Re[1]: Loop文で絶対値の範囲になれば抜けるコード
□投稿者/ Azulean (186回)-(2013/08/01(Thu) 22:40:26)
考え方としては正しそうに見えます。
疑うべきとしては、ΔQ がどのようにもたらされるかでしょうか。

たとえば、ΔQ がいつまで経っても Abs(ΔQ) < 0.01 を満たさないような出力を繰り返しているとか、ΔQ を実は更新できていないとか、そういった要素がないかも考えておきたいです。
ΔQ は実際にはどのような変数、関数、計算式によって与えられているのでしょうか。コードを提示するか、具体的な数値を書き出してみてください。
(Console.WriteLine("{0:f6}", q) など)
引用返信 編集キー/
■67431 / inTopicNo.3)  Re[1]: Loop文で絶対値の範囲になれば抜けるコード
□投稿者/ Jitta (54回)-(2013/08/01(Thu) 23:58:18)
Jitta さんの Web サイト
No67428 (ブレンド さん) に返信
> VB2010で以下のようなコードを書きました。
>
> Do Until Math.Abs(ΔQ) < 0.001
>
> これが、ΔQが−0.001〜0.001の範囲になっても、Loopを抜けてくれません。
>
> Do Until ΔQ < 0.001
>
> と書くと大丈夫なのですが、ΔQ > -0.001になっても抜けてほしいのです。
>
> 解決策があれば教えてください。

100倍して整数値にしてから比較する、とか。
引用返信 編集キー/
■67436 / inTopicNo.4)  Re[1]: Loop文で絶対値の範囲になれば抜けるコード
□投稿者/ 魔界の仮面弁士 (280回)-(2013/08/02(Fri) 10:22:23)
No67428 (ブレンド さん) に返信
> VB2010で以下のようなコードを書きました。
>         Do Until Math.Abs(ΔQ) < 0.001

Math.Abs は型変換を伴わず、正数化するだけの符号変換処理なので、
処理自体に問題は無いように見えます。

おそらく、データ型の不整合が生じているか、あるいは
演算誤差や格納誤差によるものであろうかと思います。



たとえば ΔQ が Decimal 型だった場合、上記の判定式では正しく処理できません。
比較式の右辺にある 0.001 が(Decimal ではなく) Double 型であるためです。


もし、ΔQが Decimal 型であるとすれば、右辺も Decimal にせねばなりません。
つまり「< 0.001」ではなく、「< 0.001@」または「< 0.001D」と書きます。


たとえば、下記を実行してみてください。

Dim values() As Decimal = { _
    CDec("0.0009999999999999997"), _
    CDec("0.0009999999999999998"), _
    CDec("0.0009999999999999999"), _
    CDec("0.0010000000000000000"), _
    CDec("0.0010000000000000001"), _
    CDec("0.0010000000000000002"), _
    CDec("0.0010000000000000003")}

Dim limit As Double = _
    CDbl("0.0010000000000000000")
'「Dim limit As Double = 0.001」でも同義


For Each value As Decimal In values
    Console.Write(value)
    If Math.Abs(value) < limit Then
        Console.WriteLine("<0.0010000000000000000")
    Else
        Console.WriteLine("≧0.0010000000000000000")
    End If
Next


下記のように、ズレが生じてしまうかと思います。

0.0009999999999999997<0.0010000000000000000
0.0009999999999999998<0.0010000000000000000
0.0009999999999999999≧0.0010000000000000000
0.0010000000000000000≧0.0010000000000000000
0.0010000000000000001≧0.0010000000000000000
0.0010000000000000002≧0.0010000000000000000
0.0010000000000000003≧0.0010000000000000000



上記は一例であり、実際には別の原因かも知れません。

追加調査のため、ΔQ のデータ型を明らかにすると共に、
ループを抜けてくれなかった時の ΔQ の具体的な値を、
1つ以上挙げて頂く事はできますか?

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -