如何获得5或10的下一个最高倍数

时间:2011-11-23 15:27:37

标签: java algorithm math pseudocode

从给定的double开始,我希望根据一些规则获得次高的数字,因为我在描述它们时遇到一些困难,我将通过例子说明:

Input      Desired output
-------    --------------
   0.08         0.1
   0.2          0.5
   5           10
   7           10
  99          100
 100          500
2345         5000

在某种意义上,输出应该是“5或10的下一个最高倍数”。

我希望这是可以理解的;如果没有,请告诉我。

实现将在java中,输入将为正double s。

4 个答案:

答案 0 :(得分:4)

function top5_10 (x) {
  var ten = Math.pow(10, Math.ceiling(Math.ln(x)/Math.LN10)));
  if (ten > 10 * x) { ten = ten / 10; }
  else if (ten <= x) { ten = 10 * ten; }
  return x < ten / 2 ? ten / 2 : ten;
}

或类似的东西: - )

答案 1 :(得分:2)

这是一个适用于样本数据的函数:

def f(x):
    lx = log10(x)
    e = floor(lx)
    if (lx - e) < log10(5):
        return 5 * 10 ** e
    else:
        return 10 ** (e+1)

答案 2 :(得分:2)

伪代码应该是这样的:

If number > 1
    n = 1
    While(true)
        If(number < n)
            return n
        If(number < n*5)
            return n*5
        n = n*10
Else
    n = 1.0
    While(true)
        If(number > n/2)
            return n
        If(number > n/10)
            return n*2
        n = n/10.0

对于数字&gt; 1,它检查如下:  如果&lt; 5,如果&lt; 10,10,如果&lt; 5,10。 50,50。 对于数字&lt; 1,它检查如下:  如果&gt; 0.5 1.如果&gt; 0.1,0.5。等

答案 3 :(得分:0)

如果您打算使用双精度并且需要精确的结果,那么使用双精度乘法/除法/ log10的所有方法都不起作用(或者至少难以实现并证明其正确性)。多精度算术可能对此有所帮助。或者像这样使用搜索:

powers = [1.e-309, 1.e-308, ..., 1.e309]
p = search_first_greater(powers, number)
if (number < p / 2.) return p / 2.
return p

search_first_greater可以实现为:

  • 线性搜索,
  • 或二元搜索,
  • 或按n=round(log10(number))直接计算数组索引并仅检查powers[n-1 .. n]
  • 或使用对数近似,例如从数字中删除指数部分并检查权力[]的4个元素。