2011-01-07 88 views
1

我有一個浮點數的列表,代表點的x和y座標。Python中的數字近似值

(-379.99418604651157, 47.517234218543351, 0.0) #representing point x 

一個邊包含兩個這樣的數字。

我想使用圖遍歷算法,如dijkstra,但使用浮點數如上面的那些沒有幫助。 什麼實際上,我尋找的是那些近似數的方法:

(-37*.*, 4*.*, 0.0) 

是那裏確實是一個Python的功能?

+0

from fpformat import fix – Ant 2011-01-07 14:41:13

+0

@Ant:`fix()`返回一個字符串。此外,`fpformat`從pyhon 2.6開始被棄用,並在Python 3中被刪除。 – 2011-01-07 15:04:51

+0

我知道fix會返回一個字符串,但不會被棄用;謝謝 – Ant 2011-01-07 15:50:24

回答

1

像這樣?

>>> x, y, z = (-379.99418604651157, 47.517234218543351, 0.0) 
>>> abs(x - -370) < 10 
True 
>>> abs(y - 40) < 10 
True 
2

「...使用浮點數字,例如上面的那些無助於...」 - 爲什麼不呢?我不記得整數是對Dijkstra的要求。你不關心邊緣的長度嗎?即使端點以整數值表示,這更可能是浮點數。

我從史蒂夫Skiena的「算法設計手冊」引述:

的Dijkstra在 一系列回合,每個回合 建立從s 一些新的頂點的最短路徑算法進行。具體地,X是 最小化DIST頂點(S, ⅵ)+ W(Ⅵ,Ⅹ)在所有未完成1 < = I < = N ...

距離 - 沒有提及的整數。

0

我不確定浮點數有什麼問題,但有幾種方法可以近似您的值。如果您只想圍繞它們,您可以使用math.ceil(),math.floor()math.trunc()

如果你真的想跟蹤精度,有一堆多精度數學庫listed on the wiki這可能是有用的。

0

我想你要逼近這個數字,這樣你就可以在視覺上容易地理解你在進入它的時候的算法(因爲Djikstra對節點的座標沒有限制,實際上它只對成本感興趣邊緣)。

一個簡單的函數來近似數:

>>> import math 
>>> def approximate(value, places = 0): 
...  factor = 10. ** places 
...  return factor * math.trunc(value/factor) 
>>> p = (-379.99418604651157, 47.517234218543351, 0.0) 
>>> print [ approximate(x, 1) for x in p ] 
[-370.0, 40.0, 0.0] 
1

鑑於您的載體

(-379.99418604651157, 47.517234218543351, 0.0) #representing point x 

進行舍入就像你所期望很可能是使用十進制模塊最簡單的方法:http://docs.python.org/library/decimal.html

from decimal import Decimal: 
point = (-379.99418604651157, 47.517234218543351, 0.0) #representing point x 
converted = [Decimal(str(x)) for x in point] 

之後,得到一個近似,可以使用量化方法:

>>> converted[0].quantize(Decimal('.0001'), rounding="ROUND_DOWN") 
Decimal("-379.9941") 

這種方法具有內置的,以避免舍入誤差能力的優勢。希望這是有幫助的。

編輯:

看到您的評論之後,它看起來像你想看看是否有兩點是相互靠近。這些功能可能會做你想要什麼:

def roundable(a,b): 
    """Returns true if a can be rounded to b at any precision""" 
    a = Decimal(str(a)) 
    b = Decimal(str(b)) 
    return a.quantize(b) == b 

def close(point_1, point_2): 
    for a,b in zip(point_1, point_2): 
     if not (roundable(a,b) or roundable(b,a)): 
      return False 
    return True 

我不知道這是不是小量的方法更好,但它實現起來非常簡單。