楼主:
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 所以没办法直接用取余数的方法处理
不太懂你的用意 但一般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:00OpVal = 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 法做两次除除是四则运算里最花时间的了