是否可以通过几项算术运算来计算上限(例如ceil(2.12) = 3
):* - + /
即没有强制转换和其他软件技巧,只使用division / mul / sub / addition和比较运算符?
澄清:
基本上我有一个允许将表达式赋值给变量的系统,其中表达式只能包含上述4个算术运算,比较和循环。 E.g。
var x = if(A *(1.434 + 0.4325))> 54.4534)然后45.6 否则那么43.435
我想做
var x = CEIL(...)
答案 0 :(得分:7)
这是可能的,但不要指望任何惊人的表现。最简单的算法(th(x)
)是:
frac = x;
while(frac<0) frac+=1;
while(frac>=1) frac-=1;
if(frac>0) return x-frac+1;
else return x;
您可以通过二分搜索(th(log x)
)做得更好:
lower = 0;
upper = 0;
if(x>0){
upper = 1;
while (x > upper) upper *= 2;
}else if(x<0){
lower = -1;
while (x > lower) lower *= 2;
}
while(upper-lower > 1){
//mid is guaranteed to be integer, since the upper-lower is a power of two
mid = (upper+lower)/2;
if(x > mid) lower = mid;
else if(x < mid) upper = mid;
else return mid;
}
return upper; // lower for floor