什么是可能导致Python中的NaN的可能计算?

use*_*627 53 python floating-point numpy nan

我一直在搜索,似乎有关于NaN不同编程语言的s的分散讨论,包括一些特定情况,但没有详尽或清楚.

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

tmy*_*ebu 56

如果您在没有使用浮点环境的情况下执行以下任何操作,那么您应该获得之前没有的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规范.第7.1节描述了无效操作异常,它是您即将获得NaN时引发的异常.IEEE 754中的"例外"意味着与编程语言环境中的不同.

许多特殊功能实现记录了他们在尝试实现的功能的奇点时的行为.对于参见手册页atan2log,例如.

你是专门询问NumPy和SciPy的.我不确定这是否只是简单地说"我在询问NumPy内部发生的机器算术"或"我在问什么eig()和东西." 我假设前者,但这个答案的其余部分试图与NumPy中的高级函数进行模糊连接.基本规则是: 如果函数的实现提交了上述罪行之一,则会获得NaN.

例如fft,NaN如果您的输入值大约1e1010或更大,您可能会得到s,如果您的输入值大约或更小,则您可能会失去精确度1e-1010.但是,除了真正荒谬的缩放输入之外,你还是非常安全的fft.

对于涉及矩阵数学的事情,inf - inf如果您的数字很大或者您的矩阵非常恶劣,那么NaN可以突然出现(通常通过路线).关于如何通过数值线性代数搞定问题的完整讨论太长,不能归于一个答案.我建议在几个月的时间里翻阅一本数字线性代数书(Trefethen和Bau很受欢迎).

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

#include <fenv.h>
feenableexcept(FE_INVALID);
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记那些显而易见的......"nan + <anything>","nan*<anything>"等等(当然,你确实说过"你之前没有的地方",不包括那些.仍然可能值得明确提到纳米通过任何计算传播.) (9认同)
  • @tba:这是一个愚蠢的问题. (3认同)