使用mpz变量的算术结果是什么?

时间:2013-03-07 11:54:56

标签: python python-2.7 gmp

我正在尝试使用python中的gmpy2进行一些算术运算。不幸的是我没有 知道这个算术的返回值有哪些类型。例如:

x=float(gmpy2.comb(100,50))/gmpy2.comb(200,100)
print x
print isinstance(x, (int, long, float, complex))

给了我:

1.114224180581451e-30
False

当我用Google搜索时,我找不到任何有用的信息。 有没有办法可以在python中获得对象类型? 否则,这个值的确切类型是什么?它是mpz吗? 最后一个问题,当我用mpz值进行算术运算时 示例浮点数,是否总是将类型转换为mpz?

P.S。我不知道mpz是否是我在这里使用的正确术语!我也很高兴 如果有高声望的人在stackoverflow中添加gmpy来制作它们 知道gmpy的人更容易理解这些问题。

2 个答案:

答案 0 :(得分:1)

我不知道gmpy2但您可以使用x.__class__在Python中找到对象的类型。

对于新式课程,您还可以使用type(x)

答案 1 :(得分:1)

gmpy2引入了几种新的数据类型:mpz,mpq,mpfr和mpc。它们类似于Python的int / long,fractions.Fraction,float和complex类型。因此,涉及mpz的除法通常会产生一个mpfr。

在您的示例中,您创建一个mpz,将其转换为浮点数,然后除以mpz。执行除法时,gmpy2将浮点数转换为mpfr,然后执行除法。如果你想要一个float结果,你应该将float()应用于整个结果而不仅仅是gmpy2.comb(100,50)。请注意括号中的差异。

>>> float(gmpy2.comb(100,50))/gmpy2.comb(200,100)
mpfr('1.114224180581451e-30')
>>> float(gmpy2.comb(100,50)/gmpy2.comb(200,100))
1.114224180581451e-30

为什么从float转换为mpfr? mpfr数据类型可以支持更高的精度,并且具有明显更宽的浮点范围。只要mpfr的精度大于或等于浮点数的精度(即53),那么转换就是无损的。

免责声明:我保持gmpy和gmpy2。