首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浮点算法中的NumPy向高精度转换

浮点算法中的NumPy向高精度转换
EN

Stack Overflow用户
提问于 2017-07-17 20:53:06
回答 3查看 2K关注 0票数 2

毫无疑问,在其他语言(也可能是所有语言)中都存在这种情况,但我只使用Python进行了测试。我的问题是:当对两个不同精度的值进行算术时,为什么NumPy要以精度最高的值的d类型返回结果?

例如

代码语言:javascript
复制
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是不准确的。在这种情况下,将结果转换为最高精度而不是最低精度的原因是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-17 21:04:19

造成这种情况的原因是数值计算中的一种叫做灾难性抵消的原理。

考虑两个浮点数字之间的稍微小的例子。3.0000900 - 3.000,如果将其降到4位小数点,或者在您的情况下转换为4字节,则结果值为0。然而,这些值实际上并不相同!我刚才演示的现象叫做灾难性取消。由于截断甚至舍入这一问题,我们实质上正在失去信息。

为了避免这种情况,这些操作的结果总是将类型转换为更精确的类型,因为丢失的信息是最小的。

票数 3
EN

Stack Overflow用户

发布于 2017-07-17 21:04:33

这被称为类型强制,至少在NumPy中,它总是以更高的精度强迫类型,因为这样不会意外地丢失精度,也不会导致溢出。

例如(关于“溢出”),强制float64它(排序-of)工作:

代码语言:javascript
复制
>>> np.float64(1e40) - np.float32(1)
1e40

但是如果它强迫float32,你就会得到:

代码语言:javascript
复制
>>> np.float64(1e40).astype(np.float32) - np.float32(1)
inf

这是因为最大的float323.4028235e+38

代码语言:javascript
复制
>>> np.finfo(np.float32)
finfo(resolution=1e-06, min=-3.4028235e+38, max=3.4028235e+38, dtype=float32)
票数 4
EN

Stack Overflow用户

发布于 2017-07-17 21:17:13

答案主要来自数学与数字类型

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

无论何时执行计算,如果将结果集映射到更大的数据容器中(整数类型为64而不是32),则可以保证传递令人满意的结果,但不能保证在可能较短的容器中映射一组值时不会截断结果,这意味着生成无效的结果。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45153489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档