C# Math.pow() возвращает бесконечность?

у меня есть проблемы с Math.pow в С#, возвращающем бесконечность, например:

  double a=65;
  double b=331;
  Console.Write(Math.Pow(a,b));
  //but return infinty 

но калькулятор для моего компьютера не возвращает 65 ^ 331 бесконечность, есть реальное число, верните это: 1.1866456424809823888425970808655e+600

я использую приведение к (длинное), но результат не тот же оконный калькулятор, пожалуйста, мне нужно, чтобы тип переменной возвращал тот же оконный калькулятор


person abddulrahman_ab    schedule 06.12.2013    source источник
comment
Итак, что такое бесконечность на вашей шкале?   -  person gleng    schedule 07.12.2013
comment
На самом деле неясно, о чем ваш вопрос, хотя я сделал все возможное, чтобы ответить на него. Ближе всего к вопросу является ваш заголовок, хотя ваши данные указывают на то, что вы уже знаете ответ. Так в чем вопрос?   -  person David Schwartz    schedule 07.12.2013


Ответы (4)


double имеет ограниченный диапазон; он не может сохранить этот номер.

Используйте BigInteger.

person SLaks    schedule 06.12.2013
comment
спасибо, но class bigintger return val не тот же результат, что и мой расчет - person abddulrahman_ab; 07.12.2013

Math.pow имеет ограниченный диапазон, с которым он может работать. См. документы MSDN для более подробной информации.

Я не уверен, почему вы пытаетесь вычислить 65^331. Одним из обходных путей может быть использование класс BigInteger:

BigInteger result = new BigInteger(Math.pow(65, 331))

Если это не сработает, всегда есть старое доброе умножение:

BigInteger product = 1;
BigInteger a = 65;

for (int i = 0; i < 331; i++) {
    product = BigInteger.Multiply(product, a);
}

Это должно вернуть желаемое значение.

person ashes999    schedule 06.12.2013
comment
спасибо за помощь, но проблемы с классом bigintger не решаются - person abddulrahman_ab; 07.12.2013
comment
я использую 65 ^ 331, потому что я пишу пример программы для шифрования ввода текста .... (65 ^ 331 = 1,1866456424809823888425970808655e+600), затем выполните 1,1866456424809823888425970808655e+600, этот процессор должен получить окончательный результат 17741 = 5300 530 .. [ 65 ^ 331 % 17741 ] ? - person abddulrahman_ab; 07.12.2013

Если значение выходит за пределы диапазона для типа, возвращается бесконечность. Так что, да, он может вернуть бесконечность.

person David Schwartz    schedule 06.12.2013
comment
Итак, какой тип калькулятора неограниченного окна хранения какой тип используется? - person abddulrahman_ab; 07.12.2013

Вы должны прочитать о плавающей запятой IEEE754, чтобы понять причины этого. По сути, число этой величины не подходит для машинного формата с плавающей запятой (обычно 32 или 64 бита).

С++ 32-битный и 64-битный плавающий предел содержит информацию о самых больших значениях, которые эти машинные слова будут Hold, но, короче говоря, BigInteger - это правильный способ обработки таких больших чисел.

Например, в Python (где целые числа могут иметь произвольную величину):

>>>65**331
1186645642480982388842597080865547928975
8025124874226281286044593977851408626647
1648153565617569287290861365843808026786
6910699252797849188956233075264639216543
7504315383537154855617697699290248015932
2796464262757682229990775670822339468164
8291964549985945784276239845489091652362
0705054470856040542942680710474683036796
8985285030088564076789292802170819942388
3788422698744095551323695360171668455050
6467003204582429046323962276940067249678
5724338639806479202984280300919968748839
9063613316621160349502633982277117451890
1573217436770532915029575301234171172274
1482981646754524263087660074234008789062
5L
person Community    schedule 06.12.2013