2010-06-13 67 views
0

我正在解決MCTS認證問題。程序必須計算pi直到用戶按下一個鍵,此時線程被中止,結果返回主線程並打印在控制檯中。很簡單,對嗎?這個練習實際上是關於線程的,但我遇到了另一個問題。計算pi的過程返回-1。#IND。我已閱讀web上關於此錯誤的一些資料,但我仍不確定如何解決此問題。當我將double改爲Decimal類型時,我毫不意外地很快得到Overflow Exception。所以,問題是我如何正確存儲數字?當它變得太大而不能包含在Decimal中時,我是否必須創建一個類來以某種方式存儲部分數字?Double type returns -1反覆計算pi時出現#IND/NaN錯誤

Class PiCalculator 

Dim a As Double = 1 
Dim b As Double = 1/Math.Sqrt(2) 
Dim t As Double = 1/4 
Dim p As Double = 1 
Dim pi As Double 
Dim callback As DelegateResult 

Sub New(ByVal _callback As DelegateResult) 
    callback = _callback 
End Sub 

Sub Calculate() 
    Try 
     Do While True 
      Dim a1 = (a + b)/2 
      Dim b1 = Math.Sqrt(a * b) 
      Dim t1 = t - p * (a - a1)^2 
      Dim p1 = 2 * p 

      a = a1 
      b = b1 
      t = t1 
      p = p1 

      pi = ((a + b)^2)/(4 * t) 
     Loop 
    Catch ex As ThreadAbortException 
    Finally 
     callback(pi) 
    End Try 

End Sub 

End Class 
+0

如果我在循環的末尾添加了Thread.Sleep(50),然後我得到了執行,以減緩足以使程序運行按預期。但是,我注意到返回的數字現在總是3.14159265358979。如果我等待更長時間,我沒有更精確。 – Antony 2010-06-13 00:54:51

+1

浮點數的精度有限。 – lhf 2010-06-13 01:24:34

+1

只要你使用Double作爲pi的存儲空間,你永遠不會經過那裏。 – 2010-06-13 04:43:22

回答

2

p變得inf在步驟1025

+0

爲什麼代碼返回#IND而不是#INF呢? – Antony 2010-06-13 00:57:45

+1

因爲'pi'是通過將無窮大除以無窮大而計算出來的,因爲它是未定義的。 – 2010-06-13 12:27:50