質問
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です。
アイデアはありますか
解決
bignumライブラリをインストールする必要があります。 ここにいくつかのポインターがあります。それか、bignumが組み込まれたプラットフォームを使用してください。
他のヒント
Powershellによって特別なケースとして処理されている、オーバーフライングされたダブルがあります。 $ largeInteger = [float] 111111111111111111111111111111111
を試してみてください。フロートを使用すると、まだ精度がいくらか失われます。
詳細については、 float(C#リファレンス)を参照してください。
largeIntegerを29 1から30 1に変更すると、変数のタイプがDecimalからDoubleに変更されます。 それを確認するには、$ largeInteger.GetType()を使用します。
アルゴリズムの計算は、doubleではそれほどうまく機能しません。プロンプトでループ内の2行を繰り返し実行して、各ステップの値を確認します。
largeIntegerが10進数から2進数に変わると、算術演算は正確ではなくなります。そのため、プロンプトの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
バイナリで正確に表現できないdoubleの内部の不正確な表現のために発生する歪みを見ることができます。除数が増加すると、増加する剰余の精度も向上します。