2017-02-20 20 views
0

Как определить числа рядом со значением? У меня есть следующий код, но я бы хотел его укоротить.Batch - Если значение переменной составляет около

SET /A "AI_1=%AI%-2" 
SET /A "AI_2=%AI%-1" 

SET /A "AI_1h=%AI%+1" 
SET /A "AI_2h=%AI%+2" 

IF %Speed% EQU %AI_2% GOTO :ACCELERATE 
IF %Speed% EQU %AI_1% GOTO :ACCELERATE 

IF %Speed% EQU %AI% GOTO :ACCELERATE 

IF %Speed% EQU %AI_1H% GOTO :ACCELERATE 
IF %Speed% EQU %AI_2H% GOTO :ACCELERATE 

ответ

3

Может быть, немного загадочным, но это укорачивает код

2>nul set /a "1/((speed-ai-1)*(speed-ai)*(speed-ai+1))" || goto :ACCELERATE 

Он просто пытается вычислить разделение. Если значение speed находится в диапазоне [AI-1 .. AI+1], то по крайней мере один из элементов в делителе будет 0, поэтому умножение будет 0, и деление завершится с делением с нулевой ошибкой. Условный оператор || (выполнить следующую команду, если предыдущий не сработал) будет обрабатывать этот случай.

Если значения speed и ai высоки (партия арифметическое обрабатывать только целое число подписано значения 32 бита), то операция должна быть разделена на три различных подразделений, чтобы избежать переполнения при умножении

2>nul set /a "1/(speed-ai-1), 1/(speed-ai), 1/(speed-ai+1)" || goto :ACCELERATE 
1
EQU : Equal 
NEQ : Not equal 
LSS : Less than < 
LEQ : Less than or Equal <= 
GTR : Greater than > 
GEQ : Greater than or equal >= 

Я бы объединить Leq и GEQ к defermine, если у вас есть несколько близко к текущей.

источник: https://ss64.com/nt/if.html

+0

Хорошая идея! Однако, как я сказал, код должен сравнивать 2 переменные. Значение переменной может измениться, поэтому я думаю, что LEQ и GEQ не очень полезны в этом случае ..... – SteveFest

+1

Вы можете просто продолжать проверять, когда он изменится. – NizonRox

+0

это правильно. но потребовалось бы больше кода ..... – SteveFest

1

Это for петли петли через AI-3 к AI+3, и сделать сравнение по if каждому целому между ними.

SET /A "AI_3Lower=%AI%-3" 
SET /A "AI_3Higher=%AI%+3" 

for /l %%G in (%AI_3Lower,1,%AI_3Higher) do (
    if %Speed% EQU %%G goto :accelerate 
) 
+1

Был вокруг искать решение, и что-то вроде этого было тем, что я собирался попробовать для вас, но, похоже, вы его получили. nice :) – NizonRox

1

Использование идея, которую вы уже уволили:

Set/A "Upper=AI+2,Lower=AI-2" 
If %Speed% GEq %Lower% If %Speed% LEq %Upper% GoTo ACCELERATE 
+0

Отличная идея. Но переменную% AI% нужно увеличить на 2. – SteveFest

+2

Я создал код, который делает то, что ваш код сделал короче. Я могу давать ответы только в соответствии с информацией, которая передо мной. Я отредактировал сообщение в соответствии с вашим последним комментарием. – Compo