1

我正在尝试在 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 值(例如 float)进行算术运算时,它是否总是将类型转换为 mpz?

PS 我不知道 mpz 是否是我在这里使用的正确术语!如果有高声誉的人将 gmpy 添加到 stackoverflow 中的标签以使了解 gmpy 的人更容易访问这些问题,我也会很高兴。

4

2 回答 2

1

我不知道,gmpy2但你可以在 Python 中使用x.__class__.

使用新型类,您还可以使用type(x).

于 2013-03-07T12:04:38.837 回答
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

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

免责声明:我维护 gmpy 和 gmpy2。

于 2013-03-07T13:34:36.343 回答