Script de traitement par lot avec limitation de 32 bits


1

Existe-t-il un moyen de dépasser la limite de 32 bits de l’opération de calcul des nombres entiers de Batch. Je fais quelques opérations d’ajout dans mon script et la valeur de la somme devient supérieure à la plage (2 ^ 31 -1).

Je cherche n'importe quelle idée, y compris d'autres lignes de script telles que VBscript ou quelque chose comme ça dans mon script batch.

Réponses:


0

Source Math dans les fichiers de commandes NT

Solutions de contournement: 32 bits

Les solutions de contournement pour la limitation 32 bits incluent:

  1. divisant par 1000 (ou toute puissance de 10) en coupant les derniers (3) chiffres

  2. diviser les nombres en chiffres décimaux séparés et effectuer tous les calculs et effectuer la logique "manuellement"

  3. autres langages de script

La solution de contournement n ° 1 peut être utilisée pour ajouter de l'espace disque, par exemple:

Exemple de code "Chop"

Le truc, c'est que chaque (grand) nombre est traité comme une chaîne, puis les six caractères (chiffres) les plus à droite sont coupés et ensuite seulement, le résultat est traité comme un nombre.

Il s'agit d'une solution de contournement assez grossière, car elle «arrondit» tous les chiffres avant de faire le calcul. L'ajout d'un demi-octet pour chaque sous-répertoire (% Count% / 2) à% Total% compense les troncatures. Le total général est donc plus précis que les nombres individuels. Notez que les nombres ne représentent pas de "vrais" méga-octets (1024 x 1024) mais plutôt des millions d'octets (1000 x 1000).

La solution de contournement n ° 2 est parfaitement démontrée par les fichiers de commandes de Brian Williams:

Add.bat

IsLarger.cmd

Multiply.cmd

Parfait, mais assez complexe.

La solution de contournement n ° 3, d’autres langages de script, s’explique par elle-même.

Solutions de contournement: entiers

Aucune solution de contournement n'autorise les calculs en virgule flottante, à l'exception de l'utilisation d'autres langages de script.

La seule exception peut être si vous avez un nombre de décimales limité et fixe (par exemple 2), vous pouvez alors tout multiplier par 100.

Pour afficher un délimiteur décimal dans les résultats finaux, concaténez la division ineger par 100, suivie du délimiteur décimal, suivie de la division modulo par 100:

SET Entier = Résultat / 100 SET "Fraction = Résultat %% 100" SET Résultat =% Entier%.% Fraction%

Cela risque cependant de ne pas dépasser la limite de 32 bits.

En général, pour les maths en virgule flottante, je recommanderais d'utiliser d'autres langages de script.


0

Des outils externes sont nécessaires dans ce cas. Bc (qui prend en charge la précision arbitraire et est pré-installé sur la plupart des systèmes Linux) peut être utilisé comme point de départ:

echo '123456789 * 123456789' | avant JC


Merci pour votre réponse. J'ai un problème pour effectuer l'opération mathématique avec un nombre plus élevé, cette solution va-t-elle résoudre ce problème. Je le fais dans les systèmes d'exploitation Windows
2014

Urgh, j'ai mal interprété la question pour supposer que vous utilisiez bash. Désolé pour la confusion, il est peut-être préférable de laisser la question aux utilisateurs de Windows alors.
Abel Cheung
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.