2014-09-24 11 views
11

ho provato questo (in vb.net)Perché il valore "(Double.MinValue + 1)> Double.MinValue" è falso?

(Double.MinValue + Double.Epsilon) > Double.MinValue 

ma che restituisce false. Poi ho provato questo

(Double.MinValue + 999999999999999999) > Double.MinValue 

che vale anche per falso.

Perché?

+0

Ora ho trovato http://msdn.microsoft.com/de-de/library/system.double.epsilon%28v=vs.110%29.aspx: "Tuttavia, la proprietà Epsilon non è una misura generale di precisione del tipo Double, si applica solo alle istanze Double che hanno un valore pari a zero o un esponente di -1022. " – habakuk

risposta

15

L'aggiunta di un valore molto piccolo (magnitudine) a un valore molto grande (magnitudine): praticamente nessuna differenza. In questo caso, la differenza è così piccola che non è possibile rappresentare entro la precisione di double. In sostanza:

double.MinValue + (most things) === double.MinValue 

Essa non garantisce di essere in grado di rappresentare ogni singolo double tra double.MinValue e double.MaxValue, e come si aumenta la grandezza, la risoluzione assoluta di ciò che può essere rappresentato diminuisce.

Non dimenticare: ha 308 cifre prima del decimale. Ne stai alterando pochissimi. Tu sei fondamentalmente facendo:

-179769313486232000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000000000000000000 
0000000000000000000000000000000000000000000000000000000000000000 
000000000000000000000000000000000000000000000000000000 // yikes! 
+ 999999999999999999 

Tenete a mente che double ha circa 17 cifre di precisione; quindi circa 291 cifre di quel numero enorme possono essere ampiamente ignorate.

+0

double.MinValue * 0.999999999999> double.MinValue dovrebbe funzionare se si desidera un numero che non sia negativo come double.MinValue. – gnasher729

+0

Penso che dovrebbe essere 'double.MinValue + most_things === most_things' – Mike

+0

@Mike perché, esattamente? –

Problemi correlati