Ceil函数使用有限的算术运算符集

时间:2013-03-04 12:38:14

标签: algorithm math

是否可以通过几项算术运算来计算上限(例如ceil(2.12) = 3):* - + / 即没有强制转换和其他软件技巧,只使用division / mul / sub / addition和比较运算符?

澄清:

  • 复杂性很重要,但我很乐意听到任何解决方案。
  • 模数不可用。
  • 价值观是积极的。
  • 操作不是四舍五入。
  • 通过软件技巧我的意思是mod,位级操作等。

基本上我有一个允许将表达式赋值给变量的系统,其中表达式只能包含上述4个算术运算,比较和循环。 E.g。

var x = if(A *(1.434 + 0.4325))> 54.4534)然后45.6     否则那么43.435

我想做

var x = CEIL(...)

1 个答案:

答案 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