2011-11-23 46 views
3

从给定的double我想根据一些规则,因为我有一个描述他们一些困难,我会通过例子说明,以获得下一个最高数:我怎样才能获得的5次高多或10

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秒。

+0

是你的所有输入的数字正? –

+0

是的,他们都是积极的。 – clamp

+2

'function(1e-6)'应该评估什么?诀窍问题 - 最接近'1e-6'的可表示的double不是'1e-6',而是一个稍微小一点的数字,所以'function(1e-6)'应该评估为'1e-6'。如果这种可能性让你感到不快,那么你应该使用'java.math.BigDecimal'或者其他等价物。 – Per

回答

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; 
} 

或像这样:-)

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

伪代码应该是这样的:

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 

对于大于1的数字,它会像这样检查: if < 5,5. i ˚F< 10,图10,如果< 50,50 对于数字< 1,它检查这样的: 如果> 0.5 1.如果> 0.1,0.5。等等。

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个元素。
+0

*所有使用乘法/除法/对数的方法都无法正常工作* +1对于当前发布的答案是正确的(至少在理论上),-1对于浮点型货物崇拜方法 - 对数函数超越给你完全随机的答案。 – Per

+0

@Per我纠正了我的答案。谢谢。 –

+0

为什么这些方法无法正常工作? – clamp