2015-02-24 34 views
7

Stavo leggendo il ECMAScript 5.1 spec. Dice:Cosa significano "positivo" e "negativo" in ECMAScript? +0 e -0

Il metodo slice accetta due argomenti, avviare e fine [...]. Se start è negativo, viene considerato come length + start dove lunghezza è la lunghezza dell'array. Se fine è negativo, viene considerato come lunghezza + fine dove lunghezza è lunghezza della matrice.

Che cosa significa "negativo"? Ha senso che, come in matematica,

  • Se num > 0, allora num è positivo
  • Se num < 0, quindi num è negativo.

Ma che dire di +0 e -0? In matematica c'è un singolo 0, che non è positivo né negativo. La mia ipotesi è che, in ECMAScript,

  • +0 (anche noto come zero positivo) è positivo.
  • -0 (a.k.a negativo) è negativo.

Ma ho provato a utilizzare -0 con slice ei browser lo considerano come non negativo.

Quindi, sono entrambi +0 e -0 non positivo e non negativo, nonostante i loro nomi?

Dove si definisce la positività o la negatività di un numero? Non ho trovato quello definito nelle specifiche ECMAScript. La definizione è ereditata da IEEE 754?

+0

È interessante notare che 'Math.abs (-0) === -0' è vero (in Chrome). – ssube

+1

@ssube Quindi è '0 === -0'. –

+0

@ssube Sì, '0 === -0'. [The Strict Equality Comparison Algorithm] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6) non li differenzia. [The SameValue Algorithm] (http://www.ecma-international.org/ecma-262/5.1/#sec-9.12) fa. In ECMAScript 6, 'Object.is (0, -0)' è 'false'. – Oriol

risposta

-1

I termini "numero positivo" e "numero negativo" sono in effetti definiti in t egli ECMAScript spec:

8.5 The Number Type

Il tipo numero ha esattamente 18437736874454810627 (cioè, -2 +3) valori [...]

Il 9007199254740990 (ovvero, 2 -2) distinti I valori "non-un-numero" dello standard IEEE sono rappresentati in ECMAScript come singolo speciale NaN valore [...]

Ci sono altri due valori speciali, detti infinito positivo e infinito negativo [...]

L'altra 18437736874454810624 (cioè, -2) i valori sono chiamati numeri finiti. La metà di questi sono numeri positivi e la metà sono numero negativo; per ogni valore numerico positivo finito esiste un valore negativo corrispondente di di uguale magnitudine.

Pertanto,

  • Da +0 e -0 sono due di tali numeri finiti, ognuno deve essere sia positivo che negativo.
  • Poiché ciascun numero positivo finito deve avere una contropartita negativa, o +0 è positivo e -0 è negativo o il contrario.
  • Sarebbe troppo trollare se lo zero positivo fosse un numero negativo e lo zero negativo fosse positivo. Quindi possiamo (probabilmente) supporre che +0 sia positivo e -0 sia negativo.

Tuttavia, secondo il seguente, né +0-0 può essere negativo:

5.2 Algorithm Conventions

La funzione matematica abs (x) produce il valore assoluto di x, che è -x se x è negativo (inferiore a zero) e in caso contrario è x stesso.

Infatti, nella maggior parte dei casi la specifica sembra differenziare il caso quando una variabile è positiva o negativa dal caso in cui è zero. Ad esempio,

5.2 Algorithm Conventions

La funzione matematica segno (x) rese 1 se x è positivo e -1 se x è negativo. La funzione segno non viene utilizzata in questo standard per i casi in cui x è zero.

Pertanto, la specifica è contraddittoria.

+0

Per 'slice' (e tutti gli altri metodi di sequenza), tuttavia, viene usato il significato di * meno di zero *. – Bergi

+0

Come hai concluso che la tua seconda citazione implica che "né' + 0' né '-0' possono essere negativi"? La citazione non parla di '+ 0' o' -0'. Non c'è contraddizione qui. –

+0

'-0' può rappresentare numeri minori di 0, (ad esempio' -1^1000000000'). In tal caso, abs restituisce '+ 0', che è perfettamente coerente con quanto descritto nella citazione e tutto il resto nelle specifiche. –

3

vostra confusione è in questa parte:

Ma per quanto riguarda +0 e -0? In matematica c'è un singolo 0, che non è positivo né negativo. La mia ipotesi era che, in ECMAScript,

  • +0 (a.k.a zero positivo) è positivo.
  • -0 (a.k.a negativo) è negativo.

+0 non è positivo; -0 non è negativo. Concettualmente entrambi rappresentano il numero zero o, quando si verifica un underflow, qualsiasi numero di grandezza troppo piccolo per essere rappresentato con il numero finito di bit disponibili.

La decisione di avere +0 e -0 deriva più dall'IEEE che dall'ECMA.

+0

"' + 0' non è positivo; '-0' non è negativo". Fantastico, ma hai qualche fonte? – Oriol

+0

@Oriol http://en.wikipedia.org/wiki/Signed_zero –

2

Le cose possono essere fonte di confusione se non distinguere tra i letterali+0 e -0, che rappresentano il valore matematico 0, ed i valori +0 e -0, che sono la rappresentazione in memoria di, rispettivamente, per:

  1. Qualsiasi valore matematico da 0 al minor numero reale positivo che può essere memorizzato nella doppia precisione formato di dati a 64 bit
  2. Qualsiasi valore matematico da un vasto numero reale negativo tha t può essere memorizzato nella doppia precisione formato di dati a 64 bit a 0

Se si ha una variabile contenente la Number esempio -0, questo potrebbe essere che rappresenta il numero reale 0 (che ovviamente ha alcun segno), oppure potrebbe rappresentare il numero reale 10^-10000.

Se si vede il letterale-0 o +0 nel codice, questo viene interpretato come il numero reale 0, che viene memorizzato (come qualsiasi realtà 0 numero reale sufficientemente piccola, ma non) come il Number-0 o +0, nel caso che fosse.

Qui ci sono alcune sezioni rilevanti le specifiche che, si spera chiarire le cose:

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

Quindi, la positività o la negatività di un numero ECMAScript è definita come la positività o la negatività del suo valore matematico? Quindi, poiché il valore di entrambi '+ 0' e' -0' è 0, non sono positivi o negativi? – Oriol

+0

@Oriol: proprio sotto la sezione citata viene utilizzata l'annotazione "* ... se x è negativo (meno di zero) ... *". Veramente concluderei che '-0' e' + 0' non sono né negativi né positivi, se fossero interessati le specifiche usavano il termine esplicito "non negativo" invece di "positivo". – Bergi

+0

@Oriol Ho ampliato la mia risposta. Spero che questo possa aiutare a spiegare le cose un po 'meglio. –

Problemi correlati