Koo*_*Inc 153 javascript nan
只是出于好奇.
typeof NaN
数字似乎不合逻辑.顺便说一句,就像NaN === NaN
或NaN == NaN
返回虚假一样.这是javascript的特点之一,还是有理由这样做?
编辑:谢谢你的回答.尽管让人们感到高兴并不容易.阅读答案和维基我理解得更多,但仍然是一句话
与NaN进行比较时,即使与自身进行比较,也会返回无序结果.比较谓词是信令或非信令,信令版本表示这种比较的无效例外.等式和不等式谓词是非信令的,因此x = x返回false可用于测试x是否是安静的NaN.
只是让我头晕目眩.如果有人能用人类(而不是数学家)的可读语言翻译,我会感激不尽.
pax*_*blo 99
好吧,NaN
仍然是一个数字类型,尽管它实际上代表Not-A-Number :-)
NaN
只是意味着特定值不能在数字类型的限制内表示(尽管可以说所有必须舍入的数字都适合,但这NaN
是一种特殊情况).
具体NaN
不被认为与另一个相同,NaN
因为它们可能是不同的值.但是,NaN
仍然是数字类型,就像2718或31415一样.
至于您更新的问题,以外行的方式解释:
与NaN进行比较时,即使与自身进行比较,也会返回无序结果.比较谓词是信令或非信令,信令版本表示这种比较的无效例外.等式和不等式谓词是非信令的,因此x = x返回false可用于测试x是否是安静的NaN.
所有这些意味着(分解为部分):
与NaN进行比较时,即使与自身进行比较,也会返回无序结果.
基本上,a NaN
不等于任何其他数字,包括另一个NaN
,甚至包括其自身.
比较谓词是信令或非信令,信令版本表示这种比较的无效例外.
试图在a NaN
和另一个数字之间进行比较(小于,大于等)操作可能导致抛出异常(信令)或者仅仅导致结果为假(非信令或安静).
等式和不等式谓词是非信令的,因此x = x返回false可用于测试x是否是安静的NaN.
相等(等于,不等于)的测试从不发出信号,因此使用它们不会导致异常.如果你有一个常规号码x
,那么x == x
将永远是真的.如果x
是a NaN
,则x == x
永远是假的.它为您提供了一种NaN
轻松(安静)检测的方法.
Cha*_*tie 49
这意味着不是数字.它不是javascript的特性,而是普通的计算机科学原理.
来自http://en.wikipedia.org/wiki/NaN:
返回NaN有三种操作:
使用NaN作为至少一个操作数的操作
不确定的形式
- 划分0/0,∞/∞,∞/-∞,-∞/∞和-∞/-∞
- 乘法0×∞和0×-∞
- 功率1 ^∞
- 加法∞+( - ∞),( - ∞)+∞和等价减法.
具有复杂结果的实际操作:
- 负数的平方根
- 负数的对数
- 90度(或π/ 2弧度)的奇数倍的切线
- 数字的反正弦或余弦小于-1或大于+1.
所有这些值可能不一样.对NaN的简单测试是测试value == value
是错误的.
小智 17
ECMAScript的(JavaScript的)标准规定,Numbers
是IEEE 754浮筒,其中包括NaN
作为可能的值.
ECMA 262 5e第4.3.19节:数值
原始值对应于双精度64位二进制格式IEEE 754值.
ECMA 262 5e第4.3.23节:NaN
数值是IEEE 754"非数字"值.
维基百科上的IEEE 754
IEEE浮点运算标准是由电气和电子工程师协会建立的技术标准,也是最广泛使用的浮点运算标准[...]
标准定义
- 算术格式:二进制和十进制浮点数据集,由有限数(包括带符号的零和次正规数),无穷大和特殊的"非数字"值(NaN)组成
[...]
typeof NaN
返回'number'
因为:
ECMAScript规范说数字类型包括NaN:
所有可能的数值的集合,包括特殊的"非数字"(NaN)值,正无穷大和负无穷大
因此typeof
返回:
生产UnaryExpression:
typeof
UnaryExpression的计算方法如下:
- 设val是评估UnaryExpression的结果.
- 如果Type(val)是Reference,那么
- 如果IsUnresolvableReference(val)为true,则返回
"undefined"
.- 设val为GetValue(val).
- 返回由确定的字符串类别(VAL根据表20).
Run Code Online (Sandbox Code Playgroud)Table 20 — typeof Operator Results ================================================================== | Type of val | Result | ================================================================== | Undefined | "undefined" | |----------------------------------------------------------------| | Null | "object" | |----------------------------------------------------------------| | Boolean | "boolean" | |----------------------------------------------------------------| | Number | "number" | |----------------------------------------------------------------| | String | "string" | |----------------------------------------------------------------| | Object (native and does | "object" | | not implement [[Call]]) | | |----------------------------------------------------------------| | Object (native or host and | "function" | | does implement [[Call]]) | | |----------------------------------------------------------------| | Object (host and does not | Implementation-defined except may | | implement [[Call]]) | not be "undefined", "boolean", | | | "number", or "string". | ------------------------------------------------------------------
此行为符合IEEE浮点运算标准(IEEE 754):
原始值对应于双精度64位二进制格式IEEE 754值
数值是IEEE 754"非数字"值
Number类型具有18437736874454810627(即2 53 -2 64 +3)值,表示IEEE标准二进制浮点运算中指定的双精度64位格式IEEE 754值,但9007199254740990(即,2 53 -2)个不同的"不是一个号码"的IEEE标准的值在ECMAScript中被表示为单个特殊的NaN值.(注意,NaN值是由程序表达式产生的
NaN
.)
NaN != NaN
因为他们不需要SAME非数字.因此它很有意义......另外为什么浮点数+0.00和-0.00都不相同.舍入可能会使它们实际上不为零.
至于typeof,这取决于语言.并且大多数语言会说NaN是浮点数,双精度数或数字取决于它们如何对它进行分类...我知道没有语言可以说这是一个未知类型或null.
归档时间: |
|
查看次数: |
55546 次 |
最近记录: |