python - numpy 或 scipy 有哪些可能的计算可以返回 NaN?

标签 python numpy floating-point nan

在 Python 中,哪些最常见的操作会导致使用 NumPy 或 SciPy 时产生的 NaN

例如:

1e500 - 1e500
>>> nan

这种行为的原因是什么,为什么它不返回 0?

最佳答案

如果您在不使用浮点环境的情况下执行以下任何操作,您应该得到一个以前没有的 NaN:

  • 0/0 (顶部和底部的任一标志)
  • inf/inf (顶部和底部的任一标志)
  • inf - inf(-inf) + infinf + (-inf)(-inf) - (-inf)
  • 0 * infinf * 0 (在两个因素上都有一个标志)
  • sqrt(x)x < 0
  • fmod(x, y)y = 0x是无限的;这里 fmod是浮点余数。

机器算术这些方面的规范引用是IEEE 754 specification .第 7.1 节描述了无效操作异常,这是在您即将获得 NaN 时引发的异常。 IEEE 754 中的“异常”与编程语言上下文中的含义不同。

许多特殊的函数实现记录了它们在尝试实现的函数的奇异点处的行为。参见 atan2 的手册页和 log ,例如。

您具体询问的是 NumPy 和 SciPy。我不确定这是否只是简单地说“我在询问 NumPy 引擎盖下发生的机器算法”还是“我在询问 eig() 之类的东西”。我假设是前者,但这个答案的其余部分试图与 NumPy 中的高级函数建立模糊的联系。基本规则是:如果一个函数的实现犯了上述罪过之一,你会得到一个 NaN。

对于 fft ,例如,您可能会得到 NaN s 如果您的输入值在 1e1010 左右如果您的输入值在 1e-1010 左右,则更大或更大,并且会无声地损失精度或更小。但是,除了真正可笑的缩放输入之外,使用 fft 是非常安全的。 .

对于涉及矩阵数学的事情,如果您的数字很大您的矩阵非常病态,NaN 可能会突然出现(通常通过 inf - inf 路线)。关于如何被数值线性代数搞砸的完整讨论太长了,不属于答案。我建议您花几个月的时间阅读一本数值线性代数书(Trefethen 和 Bau 很受欢迎)。

在编写和调试“不应该”生成 NaN 的代码时,我发现有用的一件事是告诉机器在发生 NaN 时进行陷阱。在 GNU C 中,我这样做:

#include <fenv.h>
feenableexcept(FE_INVALID);

关于python - numpy 或 scipy 有哪些可能的计算可以返回 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25506281/

相关文章:

java - Jython/Grinder/Grinderstone : self arg can't be coerced to net. grinder.plugin.http.HTTPUtilities

python - Fit 和 inverse_transform 中不同形状的 MinMaxScaler

java - 下一轮浮点舍入

java - Double 与 BigDecimal?

python - 在深度优先搜索有向图的同时跟踪时间

python - url 在 django 中不返回任何内容

python - django 是否需要先设置 TEST_RUNNER 才能运行 doctest?

Python:绘制逐月归一化直方图

Python:比较两个数组的所有元素并修改第二个数组

c++ - 在任何情况下都可以使用整数或 float ?