2013-02-20 55 views
2

我正在嘗試運行一些數值較大的數學公式,所以我使用了Double數據類型。但是如果我輸入較大的值,我仍然可以得到NaN的答案。那我該如何解決這個問題?獲取雙數據類型的NaN

例如,如果我通過Varx = 3和countx = 1230,我得到的結果爲NaN。

Public Function EulerForPro(ByVal Varx As Integer, ByVal Countx As Integer) As Double 

    Dim Result1 As Double = 1 
    Dim Result2 As Double = Varx 
    Dim Result As Double = 0 

    For i = 1 To Countx 
     Result1 = Result1 + (Math.Pow(-1, i) * Math.Pow(Varx, (2 * i))/factx(2 * i)) 
    Next 
    For i = 1 To Countx 
     Result2 = Result2 + (Math.Pow(-1, i) * Math.Pow(Varx, ((2 * i) + 1))/factx((2 * i) + 1)) 
    Next 
    Result = Result1 + Result2 
    Label2.Text = Result1 
    Label3.Text = Result2 
    Label4.Text = Result 
End Function 
+0

您將遇到的一個問題是雙精度數字太小,無法容納諸如Math.Pow(3,2460)等值;根據計算器,大約750個數量級太小。 'factx'函數有什麼作用? – 2013-02-20 08:42:06

+0

factx函數計算數字的階乘。 – Navaneet 2013-02-20 09:13:11

+0

我這麼認爲。這個數字也會太大以致無法放入雙倍數(比您計算的功率大得多)。我懷疑試圖用'加無窮'來劃分是你問題的原因。您需要創建自己的數據類型,以處理如此大的數字,從某處找到現有數據類型,或者改變解決問題的方法。 – 2013-02-20 09:43:41

回答

2

使用the logarithm的結果。這是大數量的標準做法。

因此,而不是乘A * B(導致溢出),請使用

Y = log(a) + log(b) 
+0

如何在我的情況下使用對數?或者舉一個例子 – Navaneet 2013-02-20 07:00:03

0

你可以嘗試使用Decimal數據類型來代替。它可以保存一個大約爲7,9 x 10^28的整數值(確切的數字是2^96 - 1,因爲它可以使用其128位中的96位來存儲值的整數部分)。但是,這是一種複雜的數據類型,您應該仔細考慮如何在代碼中使用它。並非所有隱式轉換都可以工作,特別是在使用Double時。

有關Decimal的確切規格,請參見MSDN on decimal

+1

使用小數將無助於此計算;小數點的最大尺寸約爲1100個數量級,太小以至於不能容納正在使用的數字。 – 2013-02-20 08:39:33

+0

@BrianHooper是的,我沒有檢查實際結果,但認爲它可能有助於提及'Decimal'。 – 2013-02-20 08:51:38