Добавление цифр больших целых чисел в PowerShell - PullRequest
0 голосов
/ 03 марта 2009

При добавлении цифр числа в PowerShell все хорошо с целыми числами, длина которых равна -le 29.

$largeInteger = 11111111111111111111111111111 #29 digits sums correctly
$sumDigits = 0
$largeInteger
while ($largeInteger -ne 0)
{
    $sumDigits += $largeInteger  % 10
    $largeInteger  = [MATH]::Floor($largeInteger /10)   
}

$sumDigits

Вещи становятся интересными, когда длина числа -gt 29. В случае, когда длина равна 30, сумма = 77.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 03 марта 2009

Вам нужно будет установить библиотеку bignum. Здесь есть некоторые указатели . Либо так, либо используйте платформу со встроенными бигнумами.

0 голосов
/ 03 марта 2009

У вас есть переполненный дубль, который Powershell рассматривает как особый случай. Вы можете попробовать $largeInteger = [float]111111111111111111111111111111. Вы все еще потеряете некоторую точность, используя float.

Для получения дополнительной информации см. float (C # Reference)

0 голосов
/ 03 марта 2009

Изменение значения параметра LargeInteger с 29 1 до 30 1 изменяет тип переменной с десятичной на двойную. Используйте $ largeInteger.GetType (), чтобы увидеть это.

Математика в алгоритме не работает так хорошо на двойниках. Повторно запустите 2 строки в цикле в приглашении, чтобы увидеть значения на каждом шаге.

После того, как largeInteger переходит от десятичного к двойному, арифметика перестает быть точной. Вот почему я предложил запустить 2 строки в приглашении.

Вот вывод -
PS C:> $ largeInteger% [double] 10
8
PS C:> $ largeInteger% [double] 100
88
PS C:> $ largeInteger% [double] 1000000000000000000
1.11105501764518E + 17
PS C:> $ largeInteger% [double] 1000000000000000000000
1.11111105501765E + 20
PS C:> $ largeInteger% [double] 1000000000000000000000000000
1.11111111111104E + 26
PS C:> $ largeInteger% [double] 100000000000000000000000000000
1.11111111111111E + 28
PS C:> $ largeInteger% [double] 1000000000000000000000000000000
1.11111111111111E + 29

Вы можете видеть искажение, которое возникает из-за внутреннего неточного представления двойного числа, которое не может быть точно представлено в двоичном виде. По мере увеличения делителя точность увеличения остатка также улучшается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...