[问题] 如何限制一个值在设定范围内

楼主: 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