2011-11-23 34 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