Изменение значения параметра 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
Вы можете видеть искажение, которое возникает из-за внутреннего неточного представления двойного числа, которое не может быть точно представлено в двоичном виде. По мере увеличения делителя точность увеличения остатка также улучшается.