2010-06-13 70 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