用初学者的话来说,NaN(不是数字)是什么?

RobertS支持Monica Cellio

我仍然不知道NaN或(数字不是真实数字)到底是什么。

主要问题:

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

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

  1. 结果是什么导致NaN值运算?

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

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

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

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

在整个Internet上,包括在Stack Overflow上,我都找不到关于NaN对我来说是什么的可理解的解释。


无论如何,我想以与地方的链接的形式来提供我的研究,尽管某些链接在其他编程语言中也指向相同的问题,但我已经进行了扫描以查找对我的问题的可以理解的答案,但是并没有给我总体上所需的清晰信息:

维基百科:

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

https://zh.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

堆栈溢出:

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

在Java中,NaN是什么意思?

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

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

JavaScript:什么是NaN,Object或Primitive?

非数字(NaN)

有关C ++的问题:

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

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

为什么使用英特尔C ++编译器的NaN-NaN == 0.0?

IND和NAN编号有什么区别


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

templatetypedef

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

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

假设您正在使用实数-例如1,π,e,-137、6.626等数字。在实数域中,通常可以执行一些操作,但有时没有定义结果。例如,让我们看一下对数。您可以采用许多实数的对数:例如ln e = 1,而ln 10约为2.3。但是,在数学上,未定义负数的对数。也就是说,我们不能取ln(-4)来获取实数。

现在,让我们跳到编程领域。想象一下,您正在编写一个程序或计算数字的对数,并且用户以某种方式希望您除以负数的对数。应该怎么办?

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

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

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

结果是什么导致NaN值运算?

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

  1. 取负数的对数。
  2. 取负数的平方根。
  3. 从无限减去无限。
  4. 在上执行任何算术运算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浮点数的内部有关。直观地讲,这可以归结为一个简单的事实:

  1. 有无数个实数,其中有许多个无限长的非重复小数,但是
  2. 您的计算机内存有限。

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

有关数字的实际存储方式以及在实践中的含义的更多信息,请查看传说中的指南“每个程序员应了解的浮点算法”。

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

让我们以√(-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),因此问题不在于“这是不确定的”因为“它有一个值,但那个值不是实数”。

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EGL初学者指南

来自分类Dev

对于初学者来说,这可能是最好的骨干教程。

来自分类Dev

用CSS(特别是Bootstrap)的话来说,“井”是什么?

来自分类Dev

学习OpenGL的初学者-这些OpenGL工具是什么?

来自分类Dev

Java初学者:为什么char使用''代替“”?

来自分类Dev

初学者的python函数

来自分类Dev

对于初学者来说,哪个更容易理解Laravel或Yii框架?

来自分类Dev

Apache ServiceMix初学者

来自分类Dev

初学者的Makefile

来自分类Dev

初学者的结构

来自分类Dev

函数式编程初学者:用Java编写库

来自分类Dev

初学者安装模块最简单的方法是什么?

来自分类Dev

用简单的话来说pyglet和pygame之间的区别?

来自分类Dev

初学者-用数字在python中制作基于帧的视频

来自分类Dev

初学者对元组的排序

来自分类Dev

Python初学者-数字猜谜游戏打印问题

来自分类Dev

为什么if语句会失败?(初学者)

来自分类Dev

Servlet初学者

来自分类Dev

初学者的updatedb

来自分类Dev

数字金字塔,初学者递归跟踪的难度?

来自分类Dev

初学者休眠:为什么我的休眠查询只返回一个结果而不是列表?

来自分类Dev

Twitter初学者

来自分类Dev

初学者分发

来自分类Dev

Java初学者

来自分类Dev

初学者重构

来自分类Dev

初学者帮助:此方法有什么问题?

来自分类Dev

对于版本控制初学者、UI 应用程序或终端,使用 Git 的最有效方法是什么?

来自分类Dev

MySQL工作台初学者,connection是什么意思?

来自分类Dev

作为初学者,python 中最值得学习的 10 个库是什么?