Longdouble(1e3000)成为inf:我该怎么办?

时间:2015-05-24 02:35:30

标签: python long-double

(网络上的大多数其他相关问题都涉及C&#39的longdouble和python之间的转换。这个问题不同。)

我不明白为什么我不能像这样在python中正确地获得longdouble:

In [72]: import numpy as np

In [73]: np.longdouble(1e3000)
Out[73]: inf

似乎我需要让我的python控制台知道1e3000是一个longdouble而不是double。我怎么能这样做

2 个答案:

答案 0 :(得分:6)

问题在于,通过使用类似...(1e3000)的表达式,Python解析器必须首先计算括号内的内容,并将结果传递给函数调用。 Long double不是本机类型,因此,括号内的值为inf - 它将传递给longdouble构造函数。字符串版本失败的事实可能被认为是NumPy中的错误 - 它表示字符串在内部转换为Python float(在C中为“float64”或“double”),可能使用普通的Python float构造函数。 / p>

解决方法是首先构建long double对象,其值与Python float兼容,然后将它们相乘以得到所需的值。如果需要使用多个值,请使用NumPy数组而不是单个值:

>>> x = np.longdouble(10)
>>> x
10.0
>>> x **= 3000
>>> x
9.9999999999999999999e+2999

答案 1 :(得分:1)

Python没有"长双打"。通过使用科学记数法,您正在制作浮点字面值。那些不能代表1e3000,所以你得到inf。如果你使用整数,你可以做你需要的:10 ** 3000。