python:浮点数的最大公约数(gcd),最好是numpy

我正在寻找一种有效的方法来确定两个使用python的浮点数的最大公约数.例程应具有以下布局

gcd(a, b, rtol=1e-05, atol=1e-08)
"""
Returns the greatest common divisor of a and b

Parameters
----------
a,b : float
    two floats for gcd
rtol, atol : float, optional
    relative and absolute tolerance

Returns
-------
gcd : float
    Greatest common divisor such that for x in [a,b]:
    np.mod(x,gcd) < rtol*x + atol 

.. _PEP 484:
    https://www.python.org/dev/peps/pep-0484/

"""

示例:理性和无理数的gcd

gcd(1.,np.pi,rtol = 0,atol = 1e-5)应该返回(大致)1e-5,如

In [1]: np.mod(np.pi,1e-5)
Out[1]: 2.6535897928590063e-06

In [2]: np.mod(1.,1e-5)
Out[2]: 9.9999999999181978e-06

我更喜欢使用库实现而不是自己编写.
fractions.gcd功能对我来说似乎不合适,因为我不想使用分数而且它(显然)没有公差参数.

最佳答案
好像您可以修改fractions.gcd的代码以包含公差:

def float_gcd(a, b, rtol = 1e-05, atol = 1e-08):
    t = min(abs(a), abs(b))
    while abs(b) > rtol * t + atol:
        a, b = b, a % b
    return a

转载注明原文:python:浮点数的最大公约数(gcd),最好是numpy - 代码日志