Math.Pow не правильно рассчитывает - PullRequest
9 голосов
/ 28 ноября 2010

У меня проблема с C #.Чтобы быть точным с Math.pow ().Если я попытаюсь вычислить 15 ^ 14, то получу «29192926025390624».Но если я рассчитываю это с Wolfram Alpha, я получаю «29192926025390625».Как видите, это единственное отличие - 1 число.Вольфрам Альфа прав, хотя.Почему не C #?и как мне это исправить, чтобы я мог получить правильное значение в C #? 7

Мой код довольно прост, так как я просто пытаюсь с жестко закодированными примерами.Итак, что я делаю: Math.Pow(15,14); Это дает 29192926025390624.А не «29192926025390625», который является правильным ответом.

Ссылки: Wolfram Alpha

Ответы [ 6 ]

10 голосов
/ 28 ноября 2010

Math.Pow работает с типами с плавающей точкой, которые по определению неточны. Если вам нужны целые числа произвольной точности, используйте целочисленный тип произвольной точности, такой как структура BigInteger . BigInteger также имеет метод Pow .

4 голосов
/ 28 ноября 2010

Math.Pow работает на двоих.Эта реализация с длинным получает правильный ответ:

Func<long, int, long> power = null;
power = (i, p) => p == 1 ? i : i*power(i, p - 1);
Console.WriteLine(power(15, 14));
4 голосов
/ 28 ноября 2010

Math.Pow работает на двоих. Двойные числа - это 64-битные числа с плавающей запятой и точность порядка 15-16 цифр в C # , и поэтому вы видите ошибку округления.Так работают числа с плавающей точкой.

Если вам нужна большая точность, попробуйте использовать десятичное .Это 128 бит и использует 10 в качестве базы.Это дает вам точное представление чисел до 28-29 значащих цифр.Вы можете легко определить свой собственный метод Pow для десятичного числа.

Если decimal недостаточно, обратитесь к BigInteger , который был добавлен в .NET 4.

1 голос
/ 28 ноября 2010

Math.Pow () работает правильно, проблема с двойным типом данных , см. Это.

        double i = 29192926025390625;
        Console.WriteLine("{0}",i);//the result will be 29192926025390624.0

К сожалению, проверьте значение по точке останова;в вашей программе;

0 голосов
0 голосов
/ 28 ноября 2010

C # Math.pow возвращает Double, стандартное число IEEE 754 с плавающей запятой. Он имеет только 15 значащих цифр:

http://msdn.microsoft.com/en-us/library/system.math.pow.aspx http://math.byu.edu/~schow/work/IEEEFloatingPoint.htm

...