Domanda

I incontrato zero negativo in uscita dal pitone; è stato creato per esempio nel modo seguente:

k = 0.0
print(-k)

L'output sarà -0.0.

Tuttavia, quando ho confrontare il -k a 0,0 per l'uguaglianza, produce Vero. C'è qualche differenza tra 0.0 e -0.0 (non mi interessa che presumibilmente hanno rappresentazione interna diversa, mi interessa solo il loro comportamento in un programma.) C'è qualche trappole nascoste che dovrei essere a conoscenza

?
È stato utile?

Soluzione

Check out: -0 (numero) in Wikipedia

Fondamentalmente IEEE realtà non definisce uno zero negativo

E con questa definizione per tutti gli scopi:

-0.0 == +0.0 == 0

Sono d'accordo con aaronasterling che -0.0 e +0.0 sono diversi oggetti. Rendendoli uguali (operatore di uguaglianza) fa in modo che i bug sottili non vengono introdotti nel codice. Pensare a * b == c * d

>>> a = 3.4
>>> b =4.4
>>> c = -0.0
>>> d = +0.0
>>> a*c
-0.0
>>> b*d
0.0
>>> a*c == b*d
True
>>> 

[Modifica: Per saperne di più sulla base dei commenti]

Quando ho detto a tutti gli effetti, mi aveva scelto la parola piuttosto frettolosamente. Intendevo confronto di uguaglianza standard.

Vorrei aggiungere ulteriori informazioni e riferimenti a questo proposito:

(1) Come dice il riferimento, il comparatore IEEE definisce standard in modo che +0 = -0, anziché -0 <+0. Anche se sarebbe possibile sempre di ignorare il segno zero, lo standard IEEE non lo fa. Quando una moltiplicazione o divisione comporta un firmato a zero, le solite regole si applicano segno nel calcolare il segno della risposta.

Operazioni come divmod, atan2 presenta questo comportamento. Infatti, ATAN2 conforme alla definizione IEEE come fa la lib sottostante "C". Vedere riferimento # 2 per la definizione.

>>> divmod(-0.0,100)
(-0.0, 0.0)
>>> divmod(+0.0,100)
(0.0, 0.0)

>>> math.atan2(0.0, 0.0) == math.atan2(-0.0, 0.0)
True 
>>> math.atan2(0.0, -0.0) == math.atan2(-0.0, -0.0)
False

Un modo è quello di scoprire attraverso la documentazione, se risponde la realizzazione con un comportamento IEEE. Sembra anche dalla discussione che ci sono variazioni di piattaforma sottili troppo.

Come mai questo aspetto (rispetto della definizione IEEE) non è stato rispettato in ogni dove. Vedere il rifiuto della PEP 754 (# 3) a causa di disinteresse! Non sono sicuro se questo è stato preso in seguito.

riferimenti:

  1. http://docs.sun.com/source/806- 3568 / ncg_goldberg.html # 924
  2. http://en.wikipedia.org/wiki/Atan2
  3. http://www.python.org/dev/peps/pep-0754 /

Altri suggerimenti

Si fa una differenza nel href="http://docs.python.org/py3k/library/math.html#math.atan2" rel="noreferrer"> atan2() funzione (A almeno, in alcune implementazioni). Nel mio Python 3.1 e 3.2 su Windows (che si basa sulla realizzazione C sottostante, secondo la nota CPython dettaglio di implementazione vicino al fondo del Python math documentazione del modulo ):

>>> import math
>>> math.atan2(0.0, 0.0)
0.0
>>> math.atan2(-0.0, 0.0)
-0.0
>>> math.atan2(0.0, -0.0)
3.141592653589793
>>> math.atan2(-0.0, -0.0)
-3.141592653589793

math.copysign() tratta -0.0 e +0.0 in modo diverso, a meno che non si esegue Python su uno strano piattaforma:

  

math. copysign ( x , y )
  Return x con il segno della y . Su una piattaforma che supporta zeri firmati, ritorna copysign(1.0, -0.0) -1.0.

>>> import math
>>> math.copysign(1, -0.0)
-1.0
>>> math.copysign(1, 0.0)
1.0

Sì, c'è una differenza tra 0,0 e -0,0 (anche se Python non mi permette di riproduco :-P). Se si divide un numero positivo da 0.0, si ottiene infinito positivo; se si divide lo stesso numero da -0.0 si ottiene infinito negativo.

Al di là di questo, però, non v'è alcuna differenza pratica tra i due valori.

Stessi valori, numeri ancora diversi

>>> Decimal('0').compare(Decimal('-0'))        # Compare value
Decimal('0')                                   # Represents equality

>>> Decimal('0').compare_total(Decimal('-0'))  # Compare using abstract representation
Decimal('1')                                   # Represents a > b

Riferimento:
http://docs.python.org/2/library/decimal .html # decimal.Decimal.compare http://docs.python.org/2/library/decimal .html # decimal.Decimal.compare_total

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top