设置所有标量和数组的统一Numpy dtype(如何避免精度向下转换)

时间:2013-08-15 17:10:24

标签: numpy casting floating-point precision scalar

问题: 使用numpy设置所有标量和数组变量的dtype的最简单方法是什么?

问题: 随着算法的大小和复杂性的增长,我发现很难跟踪由于舍入和截断错误引起的收敛问题。我需要一种方法来自信地设置所有操作的精度,以消除这些错误,这是一个微不足道的原因。

具体细节: 如研究部分所示,我主要很难确定如何将标量的精确类型设置为可变(见下文)。即使我的数组具有变量dtype,因为标量可能没有被明确地设置为相同或更高精度的dtype,所以会发生向下转换,并且在我的算法中我不知不觉地失去了精度。

研究

Can i set float128 as the standard float-array in numpy 这个问题给了我很好的建议;总是将数组dtype设置为变量,并在您的代码中将该变量定义为“numpy.float64”或任何您想要的。但是,如何为标量做这个?

How to perform precise calculations in Python, regardless of input types? 这个建议将我的标量映射到所需的输入。但是,有更清洁的方式吗?

我一直在做的是(感谢Ophion在下面的评论中):

import numpy as np
prec = np.float96

# a simple example of a scalar that might end up in my code
some_val = 5.0 - 3.99999999999999999992

# my current way of casting dtype of my scalars to the dtype of my arrays
myscalar = np.array(some_val, dtype=prec)

# the suggestion of using mapping:
myscalar = map(prec, (dt,))[0]

1 个答案:

答案 0 :(得分:1)

以下情况很有效:

>>> a=np.float128(5)
>>> a.dtype
dtype('float128')
>>> b=a-9
>>> b.dtype
dtype('float128')

编写一个可以为你转换的简写定义可能是最简单的:

def quad(num):
    return np.float128(num)

quad=np.float128

要仔细检查:

>>> c=quad(5)-quad(4)
>>> c.dtype
dtype('float128')
>>> c
1.0

您正在创建zero-d numpy array

>>> c.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : False
  ALIGNED : True
  UPDATEIFCOPY : False
>>> np.isscalar(c)
True
>>> c.shape
()