我有一个浮点数列表,它代表点的x和y坐标。
(-379.99418604651157, 47.517234218543351, 0.0) #representing point x
边缘包含两个这样的数字。
我想使用图形遍历算法,例如dijkstra,但使用上面的浮点数无济于事。 我实际上正在寻找的是一种近似这些数字的方法:
(-37*.*, 4*.*, 0.0)
有没有这样做的python函数?
答案 0 :(得分:2)
“...使用上面的浮点数无济于事......” - 为什么不呢?我不记得整数是Dijkstra的要求。你不关心边缘的长度吗?即使端点以整数值表示,也更有可能是浮点数。
我引用Steve Skiena的“算法设计手册”:
Dijkstra的算法继续进行 系列轮次,每一轮 建立从s的最短路径 一些新的顶点。具体来说,x 是最小化dist的顶点(s, vi)+ w(vi,x)超过所有未完成的1 < = i< = n ...
距离 - 没有提及整数。
答案 1 :(得分:1)
喜欢这样吗?
>>> x, y, z = (-379.99418604651157, 47.517234218543351, 0.0)
>>> abs(x - -370) < 10
True
>>> abs(y - 40) < 10
True
答案 2 :(得分: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
我不知道这是否比epsilon方法更好,但实现起来相当简单。
答案 3 :(得分:0)
我不确定浮点数的问题是什么,但有几种方法可以逼近你的值。如果您只想围绕它们,可以使用math.ceil()
,math.floor()
和math.trunc()
。
如果你真的想跟踪精度,那么有许多多精度数学库listed on the wiki可能会有用。
答案 4 :(得分: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]