我如何获得80位浮点数在numpy中工作

问题描述

在numpy(或通常为python)中,我想利用Intel x86 FPU本机支持80位长的double数据类型这一事实。我怎样才能做到这一点。在我的机器上(Intel Core i7,macOS Catalina,python 3.8.1,numpy 1.19.1),以下尝试似乎失败了,因为似乎没有保留其他数字:

>>> scalar = np.array([1.4756563577476488347],dtype=np.float64)
... with np.printoptions(precision=100,suppress=False):
...     print(scalar)
[1.475656357747649]


>>> scalar = np.array([1.4756563577476488347],dtype=np.float128)
... with np.printoptions(precision=100,suppress=False):
...     print(scalar)
[1.4756563577476489169]

>>> scalar = np.array([1.4756563577476488347],dtype=np.longfloat)
... with np.printoptions(precision=100,suppress=False):
...     print(scalar)
[1.4756563577476489169]

这似乎很奇怪,因为数据类型似乎就是我所认为的(64位与80位):

print(np.finfo(np.float64))

Machine parameters for float64
---------------------------------------------------------------
precision =  15   resolution = 1.0000000000000001e-15
machep =    -52   eps =        2.2204460492503131e-16
negep =     -53   epsneg =     1.1102230246251565e-16
minexp =  -1022   tiny =       2.2250738585072014e-308
maxexp =   1024   max =        1.7976931348623157e+308
nexp =       11   min =        -max
---------------------------------------------------------------

print(np.finfo(np.float128))

Machine parameters for float128
---------------------------------------------------------------
precision =  18   resolution = 1.0000000000000000715e-18
machep =    -63   eps =        1.084202172485504434e-19
negep =     -64   epsneg =     5.42101086242752217e-20
minexp = -16382   tiny =       3.3621031431120935063e-4932
maxexp =  16384   max =        1.189731495357231765e+4932
nexp =       15   min =        -max
---------------------------------------------------------------

解析输入数字与它有什么关系吗?

解决方法

问题在于 Python 仅使用64位浮点,并且您正在将Python对象传递给np.array

尝试一下:

In [26]: scalar = np.array(['1.4756563577476488347'],dtype=np.float128)                                    

In [27]: with np.printoptions(precision=100,suppress=False): 
    ...:     print(scalar) 
    ...:                                                                                                   
[1.4756563577476488347]

通过使用字符串作为文字,用于创建float128对象的代码现在位于NumPy中,这将保留值的精度。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...