Aggiunta di cifre di numeri interi di grandi dimensioni in PowerShell
-
03-07-2019 - |
Domanda
Quando si aggiungono le cifre di un numero in PowerShell, tutto va bene con numeri interi che hanno una lunghezza -le 29.
$largeInteger = 11111111111111111111111111111 #29 digits sums correctly $sumDigits = 0 $largeInteger while ($largeInteger -ne 0) { $sumDigits += $largeInteger % 10 $largeInteger = [MATH]::Floor($largeInteger /10) } $sumDigits
Le cose diventano interessanti quando la lunghezza del numero -gt 29. Nel caso in cui la lunghezza sia 30, la somma = 77.
Qualche idea?
Soluzione
Dovrai installare una libreria bignum. Ci sono alcuni suggerimenti qui . O quello o usa una piattaforma che ha i bignum integrati.
Altri suggerimenti
Hai un doppio sorvolato che viene gestito come caso speciale da Powershell. Potresti provare $ largeInteger = [float] 111111111111111111111111111111
. Perderai comunque un po 'di precisione usando un galleggiante.
Per ulteriori informazioni, vedere float (Riferimenti per C #)
La modifica di largeInteger da 29 1 a 30 1 modifica il tipo di variabile da Decimale a Doppio. Usa $ largeInteger.GetType () per vederlo.
La matematica dell'algoritmo non funziona così bene sui doppi. Esegui ripetutamente le 2 linee nel ciclo sul prompt per visualizzare i valori in ogni passaggio.
Quando largeInteger passa dal decimale al doppio, l'aritmetica non è più precisa. Questo è il motivo per cui ho suggerito di eseguire le 2 righe sul prompt.
Ecco l'output -
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
È possibile vedere la distorsione che si verifica a causa della rappresentazione imprecisa interna del doppio che non può essere rappresentata con precisione in binario. Man mano che il divisore aumenta, migliora anche l'accuratezza del resto crescente.