如果您在不使用浮点环境的情况下执行以下任何一项 *** 作,则应该得到一个NaN,而您以前没有使用过NaN:
0/0
(在顶部和底部都签名)inf/inf
(在顶部和底部都签名)inf - inf
或(-inf) + inf
或inf + (-inf)
或(-inf) - (-inf)
0 * inf
和inf * 0
(均在两个因素上均签字)sqrt(x)
什么时候x < 0
fmod(x, y)
当y = 0
或x
无限时; 这fmod
是浮点余数。
机器算术这些方面的规范参考是IEEE
754规范。第7.1节描述了无效的 *** 作异常,这是您将要获得NaN时引发的异常。IEEE
754中的“异常”意味着与编程语言上下文不同。
许多特殊的函数实现以其尝试实现的功能的奇异点来记录其行为。对于参见手册页
atan2和
log,例如。
您是在专门询问NumPy和SciPy。我不确定这是说“我正在询问有关NumPy幕后发生的机器算术”还是“我正在询问有关
eig()内容”。我假设是前者,但是此答案的其余部分试图与NumPy中的更高级别函数建立模糊的联系。基本规则是:
如果函数的实现犯了上述错误之一,则将获得NaN。
例如
fft,对于,
NaN如果输入值约为
1e1010或大于,则很容易获得;如果输入值约为
1e-1010或小于,则有可能导致精度的无声损失。但是,除了真正可笑的扩展输入之外,您还可以放心使用
fft。
对于涉及矩阵数学的事情,
inf - inf如果您的人数众多 或
矩阵病情严重,NaN可能会出现(通常是通过路线)。关于如何通过数值线性代数进行运算的完整讨论太长了,无法解决。我建议在几个月的时间里翻阅一本数字线性代数书(Trefethen和Bau很流行)。
在编写和调试“不应”生成NaN的代码时,我发现有用的一件事是告诉计算机捕获是否发生NaN。在GNU C中,我这样做:
#include <fenv.h>feenableexcept(FE_INVALID);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)