mpz变量的算术结果是什么?
我正在尝试在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
我在网上搜索了一下,没找到什么有用的信息。有没有办法让我在Python中查看一个对象的类型?不然的话,这个值的确切类型是什么?它是mpz类型吗?还有最后一个问题,当我用mpz类型的值和浮点数进行运算时,类型会总是转换成mpz吗?
附言:我不知道mpz这个术语用得对不对!如果有声望高的人能把gmpy加到StackOverflow的问题标签中,那就太好了,这样了解gmpy的人就能更容易找到这些问题。
2 个回答
1
gmpy2引入了几种新的数据类型:mpz、mpq、mpfr和mpc。它们分别类似于Python中的int/long、分数(fractions.Fraction)、浮点数(float)和复数(complex)。所以,当你用mpz进行除法运算时,通常会得到一个mpfr。
在你的例子中,你创建了一个mpz,然后把它转换成浮点数,再用另一个mpz去除它。在进行除法时,gmpy2会把浮点数转换成mpfr,然后再进行除法运算。如果你想要得到一个浮点数的结果,你应该对整个结果使用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
为什么要把浮点数转换成mpfr呢?因为mpfr这种数据类型可以支持更高的精度,并且范围比浮点数大得多。只要mpfr的精度大于或等于浮点数的精度(也就是53),那么转换就不会丢失信息。
声明:我维护gmpy和gmpy2。
1
我不太了解 gmpy2
这个东西,但你可以通过 x.__class__
来查看一个对象在Python中的类型。
如果是新式类的话,你也可以用 type(x)
来获取对象的类型。