设置所有标量和数组的统一Numpy数据类型(如何避免精度下降)

设置所有标量和数组的统一Numpy数据类型(如何避免精度下降),numpy,casting,floating-point,precision,scalar,Numpy,Casting,Floating Point,Precision,Scalar,问题: 使用numpy设置所有标量和数组变量的数据类型的最简单方法是什么 问题: 随着我的算法的规模和复杂性的增长,我发现由于舍入和截断错误,跟踪收敛问题非常困难。我需要一种方法来自信地设置所有操作的精度,以消除这些错误作为一个微不足道的原因 细节: 正如研究部分所指出的,我主要很难弄清楚如何将标量的精度类型设置为可变的(见下文)。即使我的数组有变量dtype,因为标量可能没有显式地设置为相同或更高精度的dtype,也会发生向下转换,我在算法中不知不觉地失去了精度 研究: 这个问题给了我很好的

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

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

细节: 正如研究部分所指出的,我主要很难弄清楚如何将标量的精度类型设置为可变的(见下文)。即使我的数组有变量dtype,因为标量可能没有显式地设置为相同或更高精度的dtype,也会发生向下转换,我在算法中不知不觉地失去了精度

研究:

这个问题给了我很好的建议;始终将数组数据类型设置为一个变量,并在代码中将该变量定义为“numpy.float64”或任何您想要的变量。但是,如何处理标量呢

这一条建议将我的标量映射到所需的输入。但是,有没有更干净的方法

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


由于以下方法效果良好:

>>> a=np.float128(5)
>>> a.dtype
dtype('float128')
>>> b=a-9
>>> b.dtype
dtype('float128')
可能最简单的方法是编写一个速记定义,将其转换为:

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

请仔细检查:

>>> c=quad(5)-quad(4)
>>> c.dtype
dtype('float128')
>>> c
1.0
您正在创建一个:


您可以通过
np.array(some_val,dtype=prec)
缩短选项2的标量的强制转换。甚至
np.float128(some_val)
也可以工作!为了进一步减少这一点:
dfloat=np.float128
,现在简单地
dfloat(some_val)
将导致
some_val
被转换为
float128
@Ophion,我无法想象一个更简单的答案。请随便把它作为答案贴出来,我会接受的。
quad=np.float128
>>> c=quad(5)-quad(4)
>>> c.dtype
dtype('float128')
>>> c
1.0
>>> c.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : False
  ALIGNED : True
  UPDATEIFCOPY : False
>>> np.isscalar(c)
True
>>> c.shape
()