python中的数字近似值

时间:2011-01-07 14:19:57

标签: python numbers graph-theory

我有一个浮点数列表,它代表点的x和y坐标。

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

边缘包含两个这样的数字。

我想使用图形遍历算法,例如dijkstra,但使用上面的浮点数无济于事。 我实际上正在寻找的是一种近似这些数字的方法:

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

有没有这样做的python函数?

5 个答案:

答案 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]