2013-02-20 3 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'? –

+0

Функция factx вычисляет факториал числа. – Navaneet

+0

Я так и думал. Это число также будет слишком большим, чтобы вписаться в двойное (намного больше, чем вы рассчитываете). Я подозреваю, что попытка разделить на «плюс-бесконечность» является причиной вашей проблемы. Вам необходимо создать свой собственный тип данных, способный обрабатывать такие большие числа, найти где-то существующий или изменить свой подход к решению проблемы. –

ответ

2

Используйте the logarithm результатов. Это стандартная практика для больших чисел.

Таким образом, вместо умножения * Ь (который вызывает переполнение), используйте

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

Как использовать логарифм в моем случае? или привести пример – Navaneet

0

Вы можете попробовать использовать тип данных Decimal вместо этого. Он может содержать целое значение приблизительно 7,9 x 10^28 (точное число 2^96 - 1, так как оно может использовать 96 бит его 128 для хранения целой части значения). Однако это сложный тип данных, и вы должны внимательно изучить, как его использовать в коде. Не все неявные преобразования работают, особенно при использовании Double.

См. MSDN on decimal для точных спецификаций Decimal.

+1

Использование десятичного числа не поможет в этом расчете; максимальный размер десятичной величины составляет около 1100 порядков величин, слишком малых для размещения используемых чисел. –

+0

@BrianHooper Да, я не проверял фактические результаты, но решил, что это может помочь упомянуть «Десятичный». –

Смежные вопросы