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

1 投票
2 回答
858 浏览
提问于 2025-04-17 18:15

我正在尝试在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) 来获取对象的类型。

撰写回答