NumPy在浮点运算中将精度降低到更高的精度

时间:2017-07-17 20:53:07

标签: python numpy precision

这在其他(也许是所有)语言中无疑是这种情况,但我只在Python中进行测试。我的问题是: 在对具有不同精度的两个值进行算术运算时,为什么NumPy以最高精度将结果返回到值的dtype中?

例如

import numpy as np

single = np.array([[1, 2, 3], [4, 5, 6]], np.float32)  
double = np.array([[1, 2, 3], [4, 5, 6]], np.float64)

diff = single-double

print "single data type -", single.dtype  
print "double data type -", double.dtype  
print "diff data type -", diff.dtype

的产率:

  

单一数据类型 - float32
  double数据类型 - float64
  diff数据类型 - float64

据我所知,浮点精度,diff表示的额外后半部分不准确。在这种情况下,将结果转换为最高精度而不是最低精度的原因是什么?

3 个答案:

答案 0 :(得分:3)

这称为类型强制,至少在NumPy中,它总是会以更高的精度强制转换为类型,因为这样你就不会意外地丢失精度而且不会出现溢出。

例如(关于"溢出")强制到__str__ = __repr__它(排序)工作:

float64

但如果强迫>>> np.float64(1e40) - np.float32(1) 1e40 你会得到:

float32

那是因为最大的>>> np.float64(1e40).astype(np.float32) - np.float32(1) inf float32

3.4028235e+38

答案 1 :(得分:2)

这是造成灾难性取消的数值计算原理。

考虑两个浮点数之间的略微较小的例子。 3.0000900 - 3.000,如果它被转换为4位小数,或者在你的情况下转换为4个字节,我们的结果值为0.但是这些值实际上并不相同!我刚刚在上面演示的现象称为灾难性取消。我们基本上因为截断甚至四舍五入而丢失了信息。

为避免这种情况,这些操作的结果始终是类型转换为更精确的类型,因为丢失的信息很少。

答案 2 :(得分:0)

答案主要来自mathematics and the types of numbers

types64的类型包含types32的集合,就像实数(浮点数)的类型包括整数的类型一样。

每当执行计算时,如果将结果集映射到更大的数据容器(整数类型64而不是32)中,则可以保证提供令人满意的结果,但是如果映射a,则无法保证不会截断结果可能更短的容器中的一组值,这意味着产生无效的结果。

这也一直是float和int的方式。在大多数语言中,将float与int相乘会产生浮点数,因为float(实数)可以在数学上包含int,而相反的不是true(整数类型不包含实数)。