做什么"积极"和"否定"在ECMAScript中意味着什么? +0和-0

时间:2015-02-24 18:49:44

标签: javascript language-lawyer specifications

我正在阅读ECMAScript 5.1 spec。它说:

  

slice方法有两个参数, start end [...]。如果 start 为负数,则将其视为    length + start 其中 length 是数组的长度。如果 end 为负数,则将其视为 length + end ,其中length为 length   数组。

“消极”是什么意思?有道理,就像数学一样,

  • 如果num > 0,则num为正
  • 如果num < 0,则num为否定。

但是+0-0呢?在数学中有一个0,这不是正面也不是负面。我的猜测是,在ECMAScript中,

  • +0(a.k.a。正零)是正面的。
  • -0(a.k.a.负零)是否定的。

但我尝试将-0slice一起使用,浏览器会将其视为非负数。

然后,+0-0都是非正面和非负面的,尽管它们的名字是?

定义数字的正面或负面在哪里?我没有在ECMAScript规范中找到定义。该定义是否继承自IEEE 754?

3 个答案:

答案 0 :(得分:3)

你的困惑在于这部分:

  

但是+0-0呢?在数学中有一个0,这不是正面也不是负面。我的猜测是,在ECMAScript中,

     
      
  • +0(a.k.a。正零)是正面的。
  •   
  • -0(a.k.a.负零)是否定的。
  •   

+0不是正面的; -0不是否定的。从概念上讲,它们都代表数字零,或者当发生下溢时,任何数字的数量太小而无法用可用的有限位数表示

+0-0的决定来自IEEE,而不是来自ECMA。

答案 1 :(得分:2)

如果您不区分代表数学值0的文字 +0-0以及 +0-0,分别是内存表示形式:

  1. 从0到最小正实数的任何数学值,可以以双精度64位数据格式存储
  2. 从可以存储在双精度64位数据格式中的最大负实数到0
  3. 的任何数学值

    如果你有一个包含Number实例-0的变量,这可能代表实数0(显然没有符号),或者它可能代表实数10 ^ -10000 。

    如果你在代码中看到文字 -0+0,这将被解释为实数0,它被存储(就像任何足够小但不是实际上是0实数)作为Number -0+0,视情况而定。

    以下是规范中的一些相关部分,希望澄清事情:

    1. Numeric literals
    2. The Number type
    3. Algorithm conventions
    4. Why -0===+0

答案 2 :(得分:-1)

术语“正数”和“负数”确实在ECMAScript规范中定义:

  

8.5 The Number Type

     

数字类型恰好是18437736874454810627(即,   2 64 -2 53 +3)值[...]

     

9007199254740990(即2 53 -2)明显不同   IEEE标准的“非数字”值表示为   ECMAScript作为单个特殊 NaN 值[...]

     

还有另外两个特殊值,称为正无限和   负无穷 [...]

     

另一个18437736874454810624(即,   2 64 -2 53 )值称为有限数。   其中一半是正数,一半是负数   编号;对于每个有限正数值,有一个   具有相同幅度的相应负值。

因此,

  • 由于+0-0是这些有限数字中的两个,因此每个必须为正数或负数。
  • 由于每个有限正数必须为负数,因此+0为正数,-0为负数,或相反。
  • 如果正零为负数,则负极为零,负零为正数。因此,我们可以(可能)假设+0为正,-0为负。

但是,根据以下内容,+0-0都不能为负:

  

5.2 Algorithm Conventions

     

数学函数 abs(x)产生 x 的绝对值,   如果 x 负(小于零),则为 -x ,否则为 -x    x 本身。

事实上,在大多数情况下,当变量为正或负时,规范似乎区分了它的情况。例如,

  

5.2 Algorithm Conventions

     

如果 x 为正,则数学函数 sign(x)产生1   和-1如果    x 否定。当 x 时,此标准中不使用sign函数。

因此,规范是矛盾的。