2017-02-20 8 views
0

値に近い数値を検出するにはどうすればよいですか?私は次のコードを持っていますが、私はそれを短縮したいと思います。バッチ - 変数値が数値の周りにある場合

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]の範囲内にある場合、除数の要素の少なくとも1つは0になるため、乗算は0になり、除算はで除算で失敗します。条件演算子||(前のコマンドが失敗した場合は次のコマンドを実行)がこのケースを処理します。

speedaiの値は、動作は乗算使用

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 >= 

私はあなたの現在の1に近い番号をお持ちの場合defermineするLEQとGEQを組み合わせます。

源:https://ss64.com/nt/if.html

+0

いいアイデア!しかし、私が言ったように、コードは2つの変数を比較することになっています。変数の値が変わることがあるので、LEQとGEQはこの場合にはあまり役に立ちません。 – SteveFest

+1

変更があったときには、そのままチェックを続けることができます。 – NizonRox

+0

そうです。しかし、それはより多くのコードをとるだろう..... – SteveFest

1

このforループは、AI+3AI-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

のオーバフローを回避するために、3つの異なる部門に分けなければならない、(バッチ演算のみ整数符号付き32ビット値を処理)高い場合既に却下したアイデア:

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

素晴らしいアイデア。しかし、%AI%変数を2ずつ増やす必要があります。 – SteveFest

+2

あなたのコードが短くしたコードを作成しました。私は私の前にある情報に基づいて回答を提供することしかできません。あなたの最新のコメントに基づいて投稿を編集しました。 – Compo

関連する問題