[問題] 如何限制一個值在設定範圍內

作者: syatoyan (Syatoyan)   2016-07-28 23:50:27
開發平台(Platform): C語言
額外使用到的函數庫(Library Used): 無
問題(Question): 輸入一個值
將這個值限制在設定的範圍內
然後輸出
程式碼(Code): double InVal, MinVal, MaxVal;
double OpVal;
while(InVal > MaxVal)
{
InVal = InVal - MaxVal + MinVal;
}
while(InVal < MinVal)
{
InVal = InVal - MinVal + MaxVal;
}
OpVal = InVal;
補充說明(Supplement): 這種方法 當InVal的值很大
可是MinVal 和 MaxVal的區間很小的時候
會卡在while迴圈好久
不知道還有沒有什麼更好的寫法可以縮短時間的
補充1:用角度 -360~360來看
360度 = -360度
所以 InVal = 361
MinVal = -360
MaxVal = 360
可以得到 OpVal = -359
因為MinVal不一定為0 所以沒辦法直接用取餘數的方法處理
作者: ilikekotomi (Young)   2016-07-29 00:03:00
不太懂你的用意 但一般InVal>MaxVal會讓InVal=MaxVal
作者: Richun (解放左手的OO之力)   2016-07-29 00:46:00
把最小值用offset移到0,Range=Max-Min。InVal=(int)(InVal/Range) + 餘數,不知道負數會怎樣
作者: s89227 (Kei)   2016-07-29 00:55:00
用%,外面包一層另外判斷負數?
作者: Richun (解放左手的OO之力)   2016-07-29 01:09:00
OpVal = floor((InVal-offset)/Range) + offset;這樣應該比原方法快很多,而且正負數通用。剛剛腦殘了。上面那串無視吧,半夜腦袋太鈍了...OpVal = InVal - floor((InVal-Offset)/Range) * Range;這樣結果才會是正確的。floor()在math.h裡。
作者: chuegou (chuegou)   2016-07-29 08:36:00
是說這樣用double感覺很怪
作者: noodleT (麵T)   2016-07-30 00:15:00
有 fmod 浮點數取餘數的函式可以用將角度限定在0~360個人是會這麼寫:fmod(fmod(deg,360)+360,360)
作者: Richun (解放左手的OO之力)   2016-07-30 01:36:00
可是負數mod正數還是負數,他的MinVal跟InVal可能<0
作者: noodleT (麵T)   2016-07-30 07:05:00
限定在-3~10之間:fmod(fmod(x,13)+13,13)-3x 要先加3
作者: LPH66 (-6.2598534e+18f)   2016-08-01 20:06:00
這個差距是因為 floor 法做一次除, fmod 法做兩次除除是四則運算裡最花時間的了

Links booklink

Contact Us: admin [ a t ] ucptt.com