c++ - spiegazione - virgola mobile esercizi svolti




Utilizza per il valore a virgola mobile zero negativo? (4)

Considera il seguente codice C ++:

double someZero = 0;
std::cout << 0 - someZero << '\n';   // prints 0
std::cout << -someZero << std::endl; // prints -0

La domanda sorge spontanea: a cosa serve lo zero negativo e dovrebbe essere evitato difensivamente (cioè usare la sottrazione invece di schiacciare un segno negativo su una variabile)?


Ci sono solo due casi d'uso reali che posso vedere:

  1. Volete mostrare che un valore è negativo ma molto molto piccolo (forse infinito), cioè troppo piccolo per rappresentare come un float o doppio.
  2. Stai lavorando con la matematica che consente solo i negativi, ma vuoi comunque visualizzare zero. Ci sono alcuni casi in fisica, numeri complessi e teoria dei numeri dove questo può essere utile.

Per la maggior parte, non è utile e dovrebbe essere evitato.

Puoi anche dare un'occhiata a questa domanda: C'è uno zero negativo? e la specifica IEEE 754 per il punto mobile.


Da Wikipedia:

Si afferma che l'inclusione dello zero firmato in IEEE 754 rende molto più facile ottenere l'accuratezza numerica in alcuni problemi critici [1], in particolare quando si calcola con funzioni elementari complesse [2].

Il primo riferimento è "Branch Cuts for Complex Elementary Functions o Much Ado About Nothing's Sign Bit" di W. Kahan, disponibile per il download here .

Un esempio di quella carta è 1/(+0) vs 1/(-0) . Qui, il segno di zero fa un'enorme differenza, dal momento che la prima espressione è uguale a +inf e la seconda, -inf .



Sto facendo un'app di misurazione e -0 è molto utile per i numeri misti (come la separazione in piedi e pollici).

Immagina di avere una "lunghezza" variabile che stiamo cercando di separare in "piedi" e "pollici".

(Questo è il codice java, ma la stessa idea è vera per C ++).

feet = Math.signum(length) * Math.floor(Math.abs(length / 12));
// could also do feet = length>0 ? Math.floor(length / 12) : Math.ceil(length / 12)
inches = Math.abs(length) % 12;

Se la lunghezza è compresa tra -1 piedi e 0 piedi, vorremmo che dicesse -0 per i piedi, così sappiamo che è negativo.





ieee-754