2013-02-20 56 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