我有一個浮點數的列表,代表點的x和y座標。Python中的數字近似值
(-379.99418604651157, 47.517234218543351, 0.0) #representing point x
一個邊包含兩個這樣的數字。
我想使用圖遍歷算法,如dijkstra,但使用浮點數如上面的那些沒有幫助。 什麼實際上,我尋找的是那些近似數的方法:
(-37*.*, 4*.*, 0.0)
是那裏確實是一個Python的功能?
我有一個浮點數的列表,代表點的x和y座標。Python中的數字近似值
(-379.99418604651157, 47.517234218543351, 0.0) #representing point x
一個邊包含兩個這樣的數字。
我想使用圖遍歷算法,如dijkstra,但使用浮點數如上面的那些沒有幫助。 什麼實際上,我尋找的是那些近似數的方法:
(-37*.*, 4*.*, 0.0)
是那裏確實是一個Python的功能?
像這樣?
>>> x, y, z = (-379.99418604651157, 47.517234218543351, 0.0)
>>> abs(x - -370) < 10
True
>>> abs(y - 40) < 10
True
「...使用浮點數字,例如上面的那些無助於...」 - 爲什麼不呢?我不記得整數是對Dijkstra的要求。你不關心邊緣的長度嗎?即使端點以整數值表示,這更可能是浮點數。
我從史蒂夫Skiena的「算法設計手冊」引述:
的Dijkstra在 一系列回合,每個回合 建立從s 一些新的頂點的最短路徑算法進行。具體地,X是 最小化DIST頂點(S, ⅵ)+ W(Ⅵ,Ⅹ)在所有未完成1 < = I < = N ...
距離 - 沒有提及的整數。
我不確定浮點數有什麼問題,但有幾種方法可以近似您的值。如果您只想圍繞它們,您可以使用math.ceil()
,math.floor()
和math.trunc()
。
如果你真的想跟蹤精度,有一堆多精度數學庫listed on the wiki這可能是有用的。
我想你要逼近這個數字,這樣你就可以在視覺上容易地理解你在進入它的時候的算法(因爲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]
鑑於您的載體
(-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
我不知道這是不是小量的方法更好,但它實現起來非常簡單。
from fpformat import fix – Ant 2011-01-07 14:41:13
@Ant:`fix()`返回一個字符串。此外,`fpformat`從pyhon 2.6開始被棄用,並在Python 3中被刪除。 – 2011-01-07 15:04:51
我知道fix會返回一個字符串,但不會被棄用;謝謝 – Ant 2011-01-07 15:50:24