毫无疑问,在其他语言(也可能是所有语言)中都存在这种情况,但我只使用Python进行了测试。我的问题是:当对两个不同精度的值进行算术时,为什么NumPy要以精度最高的值的d类型返回结果?
例如
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 双数据类型- float64 数据类型- float64
正如我所理解的浮点精度,额外的下半部分表示diff是不准确的。在这种情况下,将结果转换为最高精度而不是最低精度的原因是什么?
发布于 2017-07-17 21:04:19
造成这种情况的原因是数值计算中的一种叫做灾难性抵消的原理。
考虑两个浮点数字之间的稍微小的例子。3.0000900 - 3.000,如果将其降到4位小数点,或者在您的情况下转换为4字节,则结果值为0。然而,这些值实际上并不相同!我刚才演示的现象叫做灾难性取消。由于截断甚至舍入这一问题,我们实质上正在失去信息。
为了避免这种情况,这些操作的结果总是将类型转换为更精确的类型,因为丢失的信息是最小的。
发布于 2017-07-17 21:04:33
这被称为类型强制,至少在NumPy中,它总是以更高的精度强迫类型,因为这样不会意外地丢失精度,也不会导致溢出。
例如(关于“溢出”),强制float64它(排序-of)工作:
>>> np.float64(1e40) - np.float32(1)
1e40但是如果它强迫float32,你就会得到:
>>> np.float64(1e40).astype(np.float32) - np.float32(1)
inf这是因为最大的float32是3.4028235e+38。
>>> np.finfo(np.float32)
finfo(resolution=1e-06, min=-3.4028235e+38, max=3.4028235e+38, dtype=float32)发布于 2017-07-17 21:17:13
答案主要来自数学与数字类型。
types64的类型包含types32的集合,就像实数的类型(浮点数)包含整数的类型一样。
无论何时执行计算,如果将结果集映射到更大的数据容器中(整数类型为64而不是32),则可以保证传递令人满意的结果,但不能保证在可能较短的容器中映射一组值时不会截断结果,这意味着生成无效的结果。
浮点和int也是这样的。在大多数语言中,将浮点数与int相乘会产生浮点数,因为浮点数(实数)在数学上可以包含int,相反则相反(整数类型不包含实数)。
https://stackoverflow.com/questions/45153489
复制相似问题