Я дам другой ответ, который, надеюсь, будет более ясным. Дело в следующем: Поскольку точность System.Double
ограничена прибл. 15-17 десятичных цифр, результат любого Pow(BigInteger, Double)
вычисления будет иметь еще более ограниченную точность. Таким образом, нет никакой надежды на лучшее, чем ответ carlosfigueira.
Позвольте мне проиллюстрировать это на примере. Предположим, мы хотим вычислить
Pow(10, exponent)
где в этом примере я выбрал exponent
число двойной точности
const double exponent = 100.0 * Math.PI;
Конечно, это только пример. Значение exponent
в десятичном виде может быть указано как одно из
314.159265358979
314.15926535897933
314.1592653589793258106510620564222335815429687500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...
Обычно вы видите первое из этих чисел (15 цифр). Вторая версия производится с exponent.ToString("R")
и содержит 17 цифр. Обратите внимание, что точность Double
меньше 17 цифр. Третье представление выше - это теоретическое «точное» значение exponent
. Обратите внимание, что это, конечно, отличается от математического числа 100π рядом с 17-й цифрой.
Чтобы выяснить, каким Pow(10, exponent)
должно быть, я просто сделал BigInteger.Log10(x)
на большом количестве чисел x
, чтобы посмотреть, как я могу воспроизвести exponent
. Таким образом, представленные здесь результаты просто отражают реализацию BigInteger.Log10
в .NET Framework.
Получается, что любой BigInteger x
из
0x0C3F859904635FC0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
through
0x0C3F85990481FE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
делает Log10(x)
равным exponent
с точностью до 15 цифр. Аналогично любое число из
0x0C3F8599047BDEC0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
through
0x0C3F8599047D667FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
удовлетворяет Log10(x) == exponent
с точностью Double
. Другими словами, любое число из последнего диапазона равно "правильному" как результат Pow(10, exponent)
просто потому, что точность exponent
настолько ограничена.
(Интерлюдия: связки 0
s и F
s показывают, что реализация .NET учитывает только наиболее значимые байты x
. Они не заботятся о том, чтобы добиться большего, именно потому, что тип Double
имеет эту ограниченную точность.)
Единственная причина для внедрения стороннего программного обеспечения - это если вы настаиваете на том, чтобы exponent
интерпретировался как треть десятичных чисел, указанных выше. (Это действительно чудо, что тип Double
позволил вам указать именно то число, которое вы хотели, а?) В этом случае результатом Pow(10, exponent)
будет иррациональное (но алгебраическое) число с хвостом из никогда не повторяющихся десятичных знаков. Он не мог поместиться в целое число без округления / усечения. PS! Если мы возьмем показатель степени за действительное число 100π, математически результат будет другим: я подозреваю, что это какое-то трансцендентное число.
person
Jeppe Stig Nielsen
schedule
10.07.2012