有哪些可能导致Python出现NaN的计算?

发布于 2021-01-29 17:10:24

我一直在搜索,似乎NaN在不同的编程语言中对s进行了零散的讨论,包括一些特定情况,但没有详尽无遗或清晰明了。

NaN在Python中导致N的最常见操作是什么,这些操作是在使用NumPy或SciPy时产生的?

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您在不使用浮点环境的情况下执行以下任何一项操作,则应该得到一个NaN,而您以前没有使用过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或大于,则很容易获得;如果输入值约为1e-1010或小于,则有可能导致精度的无声损失。但是,除了真正可笑的扩展输入之外,您还可以放心使用fft

    对于涉及矩阵数学的事情,inf - inf如果您的人数众多
    矩阵病情严重,NaN可能会出现(通常是通过路线)。关于如何通过数值线性代数进行运算的完整讨论太长了,无法解决。我建议在几个月的时间里翻阅一本数字线性代数书(Trefethen和Bau很流行)。

    在编写和调试“不应”生成NaN的代码时,我发现有用的一件事是告诉计算机捕获是否发生NaN。在GNU C中,我这样做:

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看