|
■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つ以上挙げて頂く事はできますか?
|