用初学者的话说NaN(Not a Number)是什么?

Rob*_*rtS 7 math floating-point nan ieee-754

我仍然不明白 NaN 或 a (数字不是\xc2\xb4t 实数)到底是什么。

\n\n

主要问题:

\n\n
    \n
  1. NaN 值或 NaN 到底是什么(用非数学教授的话说)?
  2. \n
\n\n

此外,我对整个情况有几个问题,这让我在理解 NaN 应该是什么时抱怨,这对于回答我的主要问题来说不是必要的,但却是我想要的:

\n\n
    \n
  1. 哪些操作会导致结果为 NaN 值?

  2. \n
  3. 为什么 0.0 / 0.0 的结果被声明为未定义?\xc2\xb4不应该是0吗?

  4. \n
  5. 为什么任何数学运算的结果都不能用浮点数或整数来表示?一个值怎么可能是不可表示的呢?

  6. \n
  7. 为什么负数的平方根不是实数?

  8. \n
  9. 为什么 NaN 不等于不定?

  10. \n
\n\n

在整个互联网上,包括 Stack Overflow 上,我没有找到任何可以理解的解释 NaN 对我来说是什么。

\n\n
\n\n

无论如何,我想将我的研究作为地方链接提供,我已经扫描以找到我的问题的可以理解的答案,即使某些链接在其他编程语言中指向同一问题,但总体上没有给我所需的清晰信息:

\n\n

维基百科:

\n\n

https://en.wikipedia.org/wiki/NaN

\n\n

https://en.wikipedia.org/wiki/IEEE_754

\n\n

其他:

\n\n

http://foldoc.org/Not-a-Number

\n\n

https://www.youtube.com/watch?v=HN_UmxIVS6M

\n\n

https://www.youtube.com/watch?v=9EsHjXftO7s

\n\n

堆栈溢出:

\n\n

其他语言的类似或相同问题(我提供这些问题是因为我认为理解的基础即使不相同,也是非常相似的):

\n\n

在Java中,NaN是什么意思?

\n\n

对于 IEEE754 NaN 值,所有比较都返回 false 的理由是什么?

\n\n

JavaScript 中检查字符串是否为有效数字的(内置)方法

\n\n

JavaScript:什么是 NaN、Object 或原始类型?

\n\n

不是数字 (NaN)

\n\n

C++ 问题:

\n\n

安静 NaN 和信号 NaN 有什么区别?

\n\n

检查 C++ 中的 double(或 float)是否为 NaN

\n\n

为什么英特尔 C++ 编译器会出现 NaN - NaN == 0.0?

\n\n

IND 和 NAN 编号有什么区别

\n\n
\n\n

感谢您提供的所有有用的答案和评论。

\n

tem*_*def 7

您在这里提出了一系列很好的问题。这是我尝试解决每个问题的尝试。

\n\n
\n

NaN 值或 NaN 到底是什么(用非数学教授的话说)?

\n
\n\n

假设您正在处理实数 - 1、π、e、-137、6.626 等数字。在实数领域,有一些通常可以执行的运算,但有时却不能执行。没有明确的结果。例如,让我们看一下对数。您可以取大量实数的对数:例如,ln e = 1,ln 10 约为 2.3。然而,从数学上来说,负数的对数并没有定义。也就是说,我们不能用 ln (-4) 得到一个实数。

\n\n

现在,让我们进入编程领域。想象一下,您正在编写一个程序来计算一个数字的对数,并且用户以某种方式希望您除以负数的对数。应该发生什么?

\n\n

这个问题有很多合理的答案。您可以让操作抛出异常,这在 Python 等某些语言中是这样做的。

\n\n

然而,在硬件层面(IEEE-754 标准的设计者)做出的决定是给程序员第二个选择。您可以让操作产生一个值,该值表示“您希望我做一些不可能的事情,所以我报告一个错误”,而不是让程序崩溃。完成此操作的方法是让运算产生特殊值NaN(“不是数字”),表明在计算中的某个位置,您尝试执行数学上未定义的运算。

\n\n

这种方法有一些优点。在许多科学计算设置中,代码执行一系列长时间计算,定期生成可能感兴趣的中间结果。通过让未定义的操作产生NaN结果,程序员可以编写只按照他们想要的方式进行数学计算的代码,然后在代码中引入特定的位置,他们将在其中测试操作是否成功或不是。从那里,他们可以决定要做什么。将此与引发异常或彻底崩溃程序进行对比 - 这意味着程序员要么需要保护可能失败的每一系列浮点操作,要么必须自己手动测试。它\xe2\x80\x99 是关于哪个选项更好的判断调用,这就是您可以启用或禁用浮点 NaN 行为的原因。

\n\n
\n

哪些操作会导致结果为 NaN 值?

\n
\n\n

有多种方法可以NaN从操作中获取结果。这是一个采样器,尽管这不是详尽的列表:

\n\n
    \n
  1. 取负数的对数。
  2. \n
  3. 取负数的平方根。
  4. \n
  5. 从无穷大减去无穷大。
  6. \n
  7. 对 执行任何算术运算NaN
  8. \n
\n\n

NaN然而,有些运算即使在数学上未定义,也不会产生。例如,将正数除以零会得到正无穷大,即使这没有数学定义。这样做的原因是,如果当 y 从正方向趋近于零时,将 x / y 取为正 x 的极限,则该值将无限制地增长。

\n\n
\n

为什么 0.0 / 0.0 的结果被声明为未定义?\xc2\xb4不应该是0吗?

\n
\n\n

这更像是一个数学问题。这与限制的运作方式有关。让我们考虑如何定义 0 / 0。一种选择是这样说:如果我们查看表达式 0 / x 并以 x 接近零为极限,那么我们在每个点都会看到 0 ,所以极限应该为零。另一方面,如果我们查看表达式 x / x 并在 x 接近 0 时取极限,我们会在每个点看到 1,因此极限应该是 1。这是有问题的,因为我们希望 0 / 0 的值与您在计算这些表达式中的任何一个时发现的值一致,但我们无法选择一个有意义的固定值。结果, 0 / 0 的值被计算为NaN,表明这里没有明确的值可以分配。

\n\n
\n

为什么任何数学运算的结果都不能用浮点数或整数来表示?一个值怎么可能是不可表示的呢?

\n
\n\n

这与 IEEE-754 浮点数的内部结构有关。直观上,这可以归结为一个简单的事实:

\n\n
    \n
  1. 有无限多个实数,其中无限多个具有无限长的不重复小数,但是
  2. \n
  3. 您的计算机的内存有限。
  4. \n
\n\n

因此,存储任意实数可能需要存储无限长的数字序列,而我们的有限内存计算机无法做到这一点。因此,我们用浮点数存储实数的近似值,但这些实数的近似值并不是大得惊人,而无法表示值是因为我们只是存储近似值。

\n\n

有关数字实际存储方式以及这在实践中意味着什么的更多信息,请查看传奇指南“每个程序员都应该了解浮点运算”

\n\n
\n

为什么负数的平方根不是实数?

\n
\n\n

我们以 √(-1) 为例。想象这是一个实数 x;也就是说,假设 x = √(-1)。平方根的概念是,它是一个数字,如果与自身相乘,就会返回您开平方根的数字。

\n\n

那么... x 是多少?我们知道 x ≠ 0,因为 0 2 = 0 不是 -1。我们还知道 x 不能为正数,因为任何正数乘以自身都是正数。而且我们知道 x 不能为负数,因为任何负数乘以自身都是正数。

\n\n

我们现在有一个问题。无论这个 x 是什么,它都必须不为正、不为零、也不为负。这意味着它不是一个实数。

\n\n

您可以通过引入数字 i(其中 i 2 = -1)将实数推广到复数。请注意,由于上述原因,没有实数可以做到这一点。

\n\n
\n

为什么 NaN 不等于不定?

\n
\n\n

“不定”和“无论它是什么,它都不是实数”之间是有区别的。例如,0 / 0 可以说是不确定的,因为根据您接近 0 / 0 的方式,您可能会得到 0 或 1,或者可能是其他值。另一方面, √(-1) 被完美地定义为一个复数(假设我们有 √(-1) 返回 i 而不是 -i),所以问题不是“这是不确定的”,因为就像“它有一个值,但该值不是实数”。

\n\n

希望这可以帮助!

\n


归档时间:

查看次数:

7891 次

最近记录:

5 年,10 月 前