2009-10-17 10 views
7

Il est connu que les tailles de longueur et double du format .NET sont de 8 octets. Cependant, le double peut stocker un nombre significativement plus grand que long. Comment peut-il être, compte tenu que double doit également stocker des données sur les chiffres après la virgule?Valeur maximale en fonction de la taille de la longueur et de la longueur en .NET

version écourtée de la question:

Math.pow (2, 64) == long.MaxValue Math.pow (2, 64) < double.MaxValue

+0

double a moins de précision que décimal. –

+0

http://en.wikipedia.org/wiki/Double_precision –

+0

http://en.wikipedia.org/wiki/Floating_point#Range_of_floating-point_numbers –

Répondre

17

Réponse courte stocke deux seulement chiffre le plus significatif et pas tous les chiffres qui pourraient être dans le nombre. par exemple. Si vous avez une valeur double> max de long, il ne mémorisera aucune information pour les chiffres après la virgule décimale ou pour n'importe quel chiffre juste à gauche du point décimal.

Pour tous les détails voir What every computer scientist should know about Floating-Point Arithmetic

+1

Expliqué en termes assez simples pour que quiconque puisse comprendre :) – Konstantin

+0

J'ai d'abord utilisé ce texte il y a environ un an et l'a trouvé vraiment utile. – LJM

0

double est flottant numéro de point. Whitch bassicaly pense que si le nombre stocké dans le double devient plus grand, il est lancé, et la partie la moins significative est rejetée.

Par exemple en double lorsque vous avez un nombre de 100 milliards. Il peut être exactement 100 000 000 000 ou il peut être 100 000 000 000 000 000 000 000 000 001

+0

Bien que cela ne soit pas faux, il omet la principale raison pour laquelle le double a une plus grande portée que int ou long, à savoir qu'il s'agit d'un nombre à virgule flottante représenté par un significand et un exposant. –

1

Les types basés sur des nombres entiers ont un nombre entier compris entre -2^(n-1) 2 ... 2^(n -1) -1 (signé), ou 0 ... 2^n-1 (non signé).

Les variables à virgule fixe sont identiques aux types à base d'entier, seulement avec un facteur constant (par exemple pour 0,01: 0,01 * (0 ... 2^n-1)).

Les variables à virgule flottante (float et double) dans n'importe quelle langue utilisent quelques bits pour l'exposant et le reste pour le nombre avant l'exposant. Ils sont moins précis (x + 1 pourrait égaler x, x est un très grand nombre), mais ont une portée beaucoup plus grande.

+1

Btw, le "nombre avant l'exposant" est appelé mantisse ou (mieux) significand, voir http://en.wikipedia.org/wiki/Significand. –

Questions connexes