初学者所说的NaN(非数字)是什么?

问题描述 投票:3回答:4

我仍然不知道NaN或(数字不是实数)确切是什么。

主要问题:

  1. NaN值是多少或确切地是NaN(用非数学教授的话来说?)

此外,我对整个情况有一些疑问,这使我在理解NaN应该是什么方面有所抱怨,这对于回答我的主要问题不是必需的,但很希望:

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

  2. 为什么将0.0 / 0.0的结果声明为undefined?应该不是0吗?

  3. 为什么任何数学运算的结果都不能用浮点数或整数表示?值怎么可能代表不了?

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

  5. 为什么NaN不等于不确定?

我没有找到关于NaN在我整个互联网中的任何可理解的解释,包括Stack Overflow。


无论如何,我想以与地方的链接的形式来提供我的研究,我已经扫描了我的问题,即使一些链接在其他编程语言中都指向相同的问题,也已经可以找到一个可以理解的答案,但是并没有给我想要的清晰信息。总计:

维基百科:

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

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

其他:

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

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

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

堆栈溢出:

对于其他语言的相似或相同的问题(我认为理解的基础非常相似,即使不是相同,我也会提供它们:

In Java, what does NaN mean?

What is the rationale for all comparisons returning false for IEEE754 NaN values?

(Built-in) way in JavaScript to check if a string is a valid number

JavaScript: what is NaN, Object or primitive?

Not a Number (NaN)

C ++问题:

What is difference between quiet NaN and signaling NaN?

Checking if a double (or float) is NaN in C++

Why does NaN - NaN == 0.0 with the Intel C++ Compiler?

What is the difference between IND and NAN numbers


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

c++ math floating-point nan ieee-754
4个回答
2
投票

作为摘要,您可以看一下wikiedia page

在计算中,NaN代表数字,不是数字的成员可以解释为未定义值或无法表示,尤其是在浮点运算中。系统的NaN的使用由IEEE 754浮点标准引入1985年,以及其他非有限量的表示形式例如无穷大。

实际上,我会指出这一点:

如果x或y是NaN浮点数,则表达式如:

x<y
x<=y
x>y
x>=y
x==x

总是错误的。但是,>

x!=x

将为true

,这是一种检查x是否为NaN的方法(请参阅std::isnan)。>>

另一句话是,当数值计算中出现NaN时,您可能会观察到大减速(这也可能是调试时的提示)

Intel CPU上的NaN操作可能会生成异常,调用微代码,因此相对的速度变化可能很大使用CPU型号。

例如参见NaN slowdown

浮点数被编码为位模式,但并非使用所有可用的位模式(对于给定数量的位),因此有些位模式不对任何浮点数进行编码。如果找到了此类模式,则将其视为/显示为NaN。

数学数字系统包含一组“值”。例如,正整数为0、1、2、3、4等。负整数为-1,-2,-3,-4等(也许也为-0,具体取决于您的数学分支)。

在计算机领域,除其他事项外,浮点数还具有“无穷大”和“非数字”的概念。这就像数字的“ NULL”。这意味着“浮点值在数学意义上不代表数字”。

它们对于程序员float不想给出数字值[还]很有用,并且浮点标准还使用它们来表示操作的“无效”结果。

例如,您可以通过将零除以零来获得NaN,这是我所知道的任何数学分支中都没有有意义的值的运算:您如何在no

人之间共享许多蛋糕?。

((如果您尝试使用不带NaN或无穷大概念的整数来执行此操作,则将得到一个[名为]的“浮点异常”;换句话说,您的程序将崩溃。)

阅读有关Wikipedia's article about NaN的更多信息,它几乎回答了您所有的问题。

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

NaN值是多少或确切地是NaN(用非数学教授的话来说?)

假设您正在使用实数-例如1,π,e,-137、6.626等数字。在实数域中,可以执行某些操作[[通常

,但是有时没有明确的结果。例如,让我们看一下对数。您可以采用许多实数的对数:例如ln e = 1,而ln 10约为2.3。但是,在数学上,未定义负数的对数。也就是说,我们不能取ln(-4)并返回实数。所以现在,让我们跳到编程领域。想象一下,您正在编写一个程序或计算数字的对数,并且用户以某种方式希望您除以负数的对数。应该怎么办?

这个问题有很多合理的答案。您可以让操作抛出异常,这是在某些语言(如Python)中完成的。但是,在硬件级别,(由设计IEEE-754标准的人)做出的决定是不使程序崩溃,而是使操作产生一个值,该值表示“您希望我做不可能的事情,所以我正在报告错误。”完成此操作的方法是让运算产生特殊值NaN(“非数字”),表示在计算中的某个位置,您尝试执行数学上未定义的运算。

导致NaN值的操作是什么?

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

    记录一个负数。
  • 取负数的平方根。
  • 从无穷大减去无穷大
  • 但是,即使在数学上未定义,有些操作也不会产生NaN。例如,即使数学上没有定义,将正数除以零也会得到正无穷大。原因是,当y从正方向接近零时,如果对正x取x / y的极限,则该值会无限增长。
  • 为什么将0.0 / 0.0的结果声明为undefined?应该不是0吗?

    这比什么都重要。这与限制的工作方式有关。让我们考虑一下如何定义0 /0。一种选择是说:如果我们看一下表达式0 / x并在x趋近于0时取极限,那么在每个点上都会看到0,所以极限应该为零。另一方面,如果我们查看表达式x / x并在x接近0时取极限,则在每个点上都将看到1,因此极限应为1。这是有问题的,因为我们希望0/0的值与您对这两个表达式中的任何一个求值时发现的一致,但是我们不能选择一个有意义的固定值。结果,0/0的值被评估为NaN,表明此处没有可分配的明确值。

    为什么任何数学运算的结果都不能用浮点数或整数表示?值怎么代表不了?

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

      存在无限多个实数,其中无限多个具有无限长的非重复小数,但是
  • 您的计算机内存有限。
  • 结果,存储任意实数可能需要存储无限长的数字序列,而我们的有限内存计算机无法做到这一点。因此,我们有浮点数存储的实数

    不是很大]的approximations

  • ,而不能表示值的原因是我们只存储了近似值。有关实际存储数字的更多信息,以及这在实际中的含义,请查看传说中的指南"What Every Programmer Should Know About Floating-Point Arithmetic"

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

    例如,取√(-1)。想象这是一个实数x;也就是说,假设x =√(-1)。平方根的想法是,它是一个数字,如果与自身相乘,则会返回您取其平方根的数字。

    所以... x是多少?我们知道x≠0,因为0

    2

    = 0不是-1。我们也知道x不能为正数,因为任何正数乘以本身就是正数。而且,我们
    知道x不能为负数,因为任何负数乘以本身就是正数。我们现在有问题。不管这x事物是什么,它都必须不是正数,不是零且不是负数。这意味着它不是实数。

    您可以通过在i

    2

    = -1处引入数字i来将实数泛化为复数。请注意,由于上述原因,没有实数执行此操作。
    为什么NaN不等于不确定?

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

    希望这会有所帮助!


    1
    投票

    浮点数被编码为位模式,但并非使用所有可用的位模式(对于给定数量的位),因此有些位模式不对任何浮点数进行编码。如果找到了此类模式,则将其视为/显示为NaN。


    1
    投票

    数学数字系统包含一组“值”。例如,正整数为0、1、2、3、4等。负整数为-1,-2,-3,-4等(也许也为-0,具体取决于您的数学分支)。


    0
    投票

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

    © www.soinside.com 2019 - 2024. All rights reserved.