Python 3.x Python-如何在不重载函数的情况下处理int和gmpy/mpz?
我对python非常陌生,必须实现一些算法。为了对大数字(>1024位)实现更好的性能,我希望使用gmpy2/mpz——但我仍然希望支持普通的python整数 由于Python缺少函数重载,我想知道如何最好地实现这一点Python 3.x Python-如何在不重载函数的情况下处理int和gmpy/mpz?,python-3.x,Python 3.x,我对python非常陌生,必须实现一些算法。为了对大数字(>1024位)实现更好的性能,我希望使用gmpy2/mpz——但我仍然希望支持普通的python整数 由于Python缺少函数重载,我想知道如何最好地实现这一点 if(a.__class__.__name__ == 'mpz'): a = gmpy2.floor(x/8) else: a = floor(x/8) 有没有更好的方法来避免这种二元性 在您的示例中,将首先解释x/8,并生成标准的Python浮点类型。这将导致
if(a.__class__.__name__ == 'mpz'):
a = gmpy2.floor(x/8)
else:
a = floor(x/8)
有没有更好的方法来避免这种二元性 在您的示例中,将首先解释
x/8
,并生成标准的Python浮点类型。这将导致大数字的精度损失,因为浮点类型只有53位精度
如果使用整数,则应使用楼层除法运算符/
。不需要转换为浮点。该方法自动处理Python整数和mpz类型
>>> 123456789//256
482253
>>> gmpy2.mpz(123456789)//256
mpz(482253)
>>> 123456789//gmpy2.mpz(256)
mpz(482253)
>>> gmpy2.mpz(123456789)//gmpy2.mpz(256)
mpz(482253)
回答评论中的问题…
如果您使用的是大整数输入,并且需要整数结果,那么我将避免浮点运算,而完全使用整数。下面的代码段应该同时使用Python整数和mpz类型,并且不受Python浮点类型精度的限制
q,r = divmod(123456789,256)
q += bool(r)
q
将获得所需的结果 非常确定gmpy2.floor
将处理这两种情况。你试过了吗?啊,非常感谢!请允许我问一下,因为floor只是一个例子,我如何最好地处理gmpy2.ceil()
?因为据我所知,天花板没有同等的标准。