1

Есть ли способ преодолеть 32-битное ограничение целочисленной математической операции Batch. Я делаю некоторую операцию сложения в моем скрипте, и значение суммы становится больше, чем диапазон (2 ^ 31 -1).

Я ищу любую идею, даже включая некоторые другие строки сценариев, такие как VBscript или что-то подобное в моем пакетном сценарии.

2 ответа2

0

В этом случае необходимы внешние инструменты. В качестве отправной точки можно использовать bc (который поддерживает произвольную точность и предварительно установлен в большинстве систем Linux):

эхо '123456789 * 123456789' | До нашей эры

0

Исходный Math в пакетных файлах NT

Обходные пути: 32-разрядный

Обходные пути для 32-разрядного ограничения включают в себя:

  1. деление на 1000 (или любая степень 10) путем обрезания последних (3) цифр

  2. разбивая числа на отдельные десятичные цифры и выполняя всю математику и перенося логику "вручную"

  3. другие скриптовые языки

Обходной путь # 1 может использоваться для добавления дискового пространства, например:

Пример кода "Чоп"

Хитрость заключается в том, что каждое (большое) число обрабатывается как строки, затем отбираются самые правые 6 символов (цифр), и только тогда результат обрабатывается как число.

Это довольно грубый обходной путь, поскольку он "округляет" все числа перед выполнением математики. Однако добавление половины мегабайта для каждого подкаталога (% Count% / 2) к% Total% компенсирует усечения, поэтому итоговый итог более точен, чем отдельные числа. Обратите внимание, что числа не представляют "настоящие" мегабайты (1024 x 1024), а, скорее, миллионы байтов (1000 x 1000).

Обходной путь № 2 отлично демонстрируется пакетными файлами Брайана Уильямса:

Add.bat

IsLarger.cmd

Multiply.cmd

Идеально, но довольно сложно.

Обходной путь № 3, другие языки сценариев, не требует пояснений.

Обходные пути: целые числа

Нет реальных обходных путей, позволяющих использовать математику с плавающей запятой, кроме использования других языков сценариев.

Единственным исключением может быть, если у вас ограниченное и фиксированное количество десятичных знаков (например, 2), тогда вы можете просто умножить все на 100.

Чтобы отобразить десятичный разделитель в конечных результатах, объедините деление Ингера на 100, затем десятичный разделитель и деление по модулю на 100:

SET Whole = Result / 100 SET "Fraction = Result %% 100" SET Result =% Whole%.%Доля%

Это может нарушить 32-битный лимит.

В целом, для математики с плавающей точкой я бы рекомендовал использовать другие языки сценариев.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .