![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Расширение 32-битной арифметики |
|
|
CMD/BAT - Расширение 32-битной арифметики
|
Старожил Сообщения: 426 |
Казалось, что данный вопрос уже поднимался в ветке, но ничего не нашлось...
Предлагаю поделиться наработками по увеличению разрядности арифметики - 32 бита обычно хватает, но только до поры, пока не начинается работа с кучей файлов и их размеры не вылазят за 4ГБ... однажды я наскоро "заткнул" брешь введя отдельно накопитель в гигабайтах, но выглядело это неказисто и работало только в плане сравнения чисел, без вывода на экран... после этого делал пару "подходов" - хотелось "красиво" реализовать 4 базовые функции и функции по представлению данных (перевод в текст и обратно), но никчему так и не пришел. ![]() |
|
------- Отправлено: 19:24, 01-11-2010 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Есть консольные калькуляторы
|
Отправлено: 21:36, 01-11-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать NiOl, имхо "универсальные" варианты противоречат духу скриптов...
![]() утилит много (тот же AWK), да и WSH всегда под рукой, можно даже совместить в одном файле на пробу, вариант суммы/разности для 16-разрядных чисел ~ 32 петабайта: @echo off call :SUM -99000900007 -99000900007 pause>nul& exit :SUM %int% %int% [%VarSum%] SETLOCAL EnableDelayedExpansion& set "$af=%~1"& set "$bf=%~2" for /f "tokens=* delims=+-0" %%i in ("%$af%") do set "$am=%%i" for /f "tokens=* delims=+-0" %%i in ("%$bf%") do set "$bm=%%i" for /f "tokens=* delims=0" %%i in ("%$am:~-8%") do set /a "$ah=%$af:~,-8%+0,$al=%%i+0"& if !$ah! lss 0 set "$al=-!$al!" for /f "tokens=* delims=0" %%i in ("%$bm:~-8%") do set /a "$bh=%$bf:~,-8%+0,$bl=%%i+0"& if !$bh! lss 0 set "$bl=-!$bl!" set /a "$sl=($al)+($bl)"& set "$ml=!$sl:-=!" set /a "$sh=($ah)+($bh)+(%$sl:~,-8%+0)" if %$sh% gtr 0 if %$sl% lss 0 set /a "$sh-=1,$sl=100000000-%$ml:~-8%" if %$sh% lss 0 if %$sl% gtr 0 set /a "$sh+=1,$sl=%$ml:~-8%-100000000" set $ml=%$sl:-=%& set $ml=0000000!$ml:~-8! if %$sh% equ 0 (set "$sf=!$sl!") else set "$sf=%$sh%!$ml:~-8!" for /f "delims=" %%i in ("%$sf%") do ( ENDLOCAL& if "%~3"=="" (echo %%i) else set "%~3=%%i") GoTo :EOF - делим число на 2 части по восемь 10-тичных разрядов; - складываем отдельно младшую/старшую части; - обрабатываем перенос из младшей в старшую; - соединяем в одну строку. |
Отправлено: 12:50, 02-11-2010 | #3 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать обобщение на случай чисел любой длины (до 1024 десятичных знаков):
:SUM %int% %int% [%VarSum%] ::---------------------------- SETLOCAL EnableDelayedExpansion& set "$a=%~1"& set "$b=%~2" if "%$a:~,1%"=="-" (set "$az=-"&set "$a=%$a:-=%") else set "$az=" if "%$b:~,1%"=="-" (set "$bz=-"&set "$b=%$b:-=%") else set "$bz=" set $p=0& for /l %%n in (1,1,128) do (set/a "$_a=0,$_b=0" if defined $a for /f "tokens=* delims=0" %%i in ("!$a:~-9!") do set/a "$_a=%$az%%%i+0"&set "$a=!$a:~,-9!" if defined $b for /f "tokens=* delims=0" %%i in ("!$b:~-9!") do set/a "$_b=%$bz%%%i+0"&set "$b=!$b:~,-9!" set/a "$_%%n=($_a)+($_b)+(!$p!+0)"& set/a "$p=!$_%%n:~,-9!+0"& set/a "$_%%n=!$_%%n!-(!$p!000000000)" if "!$a!"=="" if "!$b!"=="" set/a $n=%%n+1& set "$_!$n!=!$p!"& goto:SUM_LOOP) :SUM_LOOP set/a "$z=0,$f=0"& for /l %%n in (%$n%,-1,1) do (if !$z! neq 0 (set/a "$k=%%n+1,$x=!$z!*($_%%n)" set "$m=!$_%%n:-=!"& if !$x! lss 0 set/a "$f=1,$_!$k!=$_!$k!-(!$z!),$_%%n=!$z!*(1000000000-!$m:~-9!)" ) else if !$_%%n! neq 0 if "!$_%%n:~,1!"=="-" (set "$z=-1") else set "$z=+1") if !$f! neq 0 GoTo:SUM_LOOP if %$z% equ 0 (set "$s=0") else set "$s="& for /l %%n in (%$n%,-1,1) do ( if defined $s (set "$m=00000000!$_%%n:-=!"& set "$s=!$s!!$m:~-9!") else if !$_%%n! neq 0 set "$s=!$_%%n!") for /f "delims=" %%i in ("%$s%") do ENDLOCAL& if "%3"=="" (echo %%i) else set "%~3=%%i" GoTo:EOF |
Последний раз редактировалось amel27, 10-11-2010 в 06:38. Причина: оптимизация Отправлено: 12:48, 03-11-2010 | #4 |
Старожил Сообщения: 426
|
Профиль | Отправить PM | Цитировать amel27, примерно так и поступил, только в Вашем примере непонятен смысл "delims=0" (подозреваю, что обход ошибки автоматического преобразования из восьмеричной системы), ну да не столь важно, т.к. подумывал об использовании шестнадцатиричной системы для хранения и разбиения строки значения на части...
Цитата amel27:
зы: впервые вопрос ограничения 32 бит возник в батнике, лепящем HTML-ки для выкладывания фоток и прочего (с уже готовыми превьюшками), там сделал процедурку для пересчета размера в "более наглядный" вид: |
||
------- Отправлено: 22:15, 08-11-2010 | #5 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата NiOl:
Цитата NiOl:
|
||
Отправлено: 12:50, 09-11-2010 | #6 |
Старожил Сообщения: 426
|
Профиль | Отправить PM | Цитировать Цитата amel27:
![]() парочка моментов на тему автопреобразования типа данных: 1: намучался, пока отлаживал скрипт "напоминалки" - взбрело же в голову сделать фичу - если число задержки начинается с нуля - то это секунды, а иначе - минуты (ну когда 2 минуты - мало, а 3 - много ![]() если интересно вот он: 2: Обход преобразования из восмеричной системы я сделал так (я использовал по 9 цифр для сложения) поскольку из 10го разряда мне главное не вылезти за цифру 1 (остальные 9 разрядов могут содержать любые цифры) и использовал его как раз для "переноса", то младшая часть получалась просто: set /a Low=1%Src:~-9%-1000000000 - использовал так нелюбимое мной автопреобразование типа ![]() А вот обработать лидирующий минус - не догадался, в результате было только сложение (ну оно мне и было нужно в конкретной задаче). |
|
------- Отправлено: 17:34, 09-11-2010 | #7 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата NiOl:
Цитата NiOl:
Цитата NiOl:
|
|||
Отправлено: 06:35, 10-11-2010 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата amel27:
|
|
Отправлено: 09:39, 10-11-2010 | #9 |
Старожил Сообщения: 426
|
Профиль | Отправить PM | Цитировать Цитата amel27:
Цитата amel27:
Цитата amel27:
Цитата Iska:
![]() |
||||
------- Отправлено: 23:38, 12-11-2010 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
2 видеокарты по 2 гига в 32-битной ОС | NiOl | Видеокарты | 19 | 18-11-2009 04:56 | |
Конкурс - Установка Windows 7 - часть 9: Установка 32-битной версии или 64-битной Windows | OSZone | Microsoft Windows 7 | 0 | 30-10-2009 17:30 | |
Установка - Как создать ISO образ с 64 битной и 32 битной осью на борту? | .Support | Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista | 2 | 14-09-2008 18:23 | |
Драйвер - несовместимость видеокамеры с вистой 64-битной | Фрекен Бок | Microsoft Windows Vista | 9 | 09-05-2008 19:38 | |
точность плавающей арифметики | bilytur | Программирование и базы данных | 23 | 01-07-2004 06:58 |
|