2015-03-07 8 views
1

Math.Pow, кажется, работает неправильно для больших результатов. Вероятно, это потому, что для расчетов используется double (How is Math.Pow() implemented in .NET Framework?).Существуют ли какие-либо встроенные .NET-альтернативы для использования мощности числа (Math.Pow) без ошибок?

Например:

public static void Main() 
{ 
    Console.WriteLine((long)Math.Pow(17, 13)); 
    Console.WriteLine(Pow(17, 13)); 
} 

public static long Pow(int num, int pow) 
{ 
    long answer = 1; 
    for (int i = 0; i < pow; i++) 
    { 
     answer *= num; 
    } 

    return answer; 
} 

В результате из приведенной выше коды:

9904578032905936 
9904578032905937 

Есть ли встроенный в .NET альтернатив для использования мощности ряда без ошибок?

+0

Вы видите ошибки округления. Используйте 'Math.Round()', если вы ожидаете целочисленный результат. – DrKoch

ответ

9

Структура BigInteger имеет метод Pow. Эта структура находится в пространстве имен System.Numerics и была представлена ​​в .NET Framework 4.0. Перед использованием вам необходимо добавить ссылку на сборку System.Numerics.

using System; 
using System.Numerics; 

public static class Program 
{ 
    public static void Main(string[] args) 
    { 
     Console.WriteLine(BigInteger.Pow(17, 13)); // 9904578032905937 
    } 
} 

Обратите внимание, что BigInteger подходит только для целочисленной арифметики; он не может обрабатывать дробные числа.