Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python-如何在不重载函数的情况下处理int和gmpy/mpz?_Python 3.x - Fatal编程技术网

Python 3.x Python-如何在不重载函数的情况下处理int和gmpy/mpz?

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浮点类型。这将导致

我对python非常陌生,必须实现一些算法。为了对大数字(>1024位)实现更好的性能,我希望使用gmpy2/mpz——但我仍然希望支持普通的python整数

由于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()
?因为据我所知,天花板没有同等的标准。