質問

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の内部の不正確な表現のために発生する歪みを見ることができます。除数が増加すると、増加する剰余の精度も向上します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top