这在其他(也许是所有)语言中无疑是这种情况,但我只在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
表示的额外后半部分不准确。在这种情况下,将结果转换为最高精度而不是最低精度的原因是什么?
答案 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(整数类型不包含实数)。