2 votes

C++ pourquoi le maximum du double 64bit a 308 chiffres?

Dans mon environnement (Win10 64bit, VC++2019 et projet 32bit), sizeof(double) est de 8 octets, la valeur maximale devrait être de 1.84e19 . Mais std::numeric_limits<double>::max() est autour de 1.79e308 .

Pourquoi sont-ils si différents ?


Le WIKI contient des informations plus détaillées : Format flottant à double précision

Les bits sont disposés comme suit : enter image description here

La valeur réelle assumée par une donnée 64-bit double-précision donnée avec une valeur de exposant biaisé donné e et une fraction de 52 bits est :

enter image description here

Donc si vous tapez sur Google 1.999*2^1023 dans votre navigateur, cela vous donnera 1.796794e+308 .

3voto

pacukluka Points 640

Les types à virgule flottante fonctionnent différemment des types entiers.

Les types entiers font directement correspondre les valeurs de leur plage min-max à toutes les permutations binaires de tous les 0 à tous les 1. Ils peuvent donc représenter directement une valeur, si elle est dans l'intervalle.

Les types à virgule flottante sont essentiellement 2 nombres : fraction ( mantisse ) et l'exposant.

Ainsi, le nombre 1 000 000 pourrait être représenté par la fraction 1 et l'exposant 6 (10^6).

Un nombre à virgule flottante peut donc représenter une gamme massive de nombres (la gamme est limitée par la gamme des exposants) avec une précision variable (la précision est limitée par la gamme des fractions). Au fur et à mesure que les nombres deviennent plus grands, en raison du nombre limité de chiffres de la fraction, les petits nombres seront de moins en moins précis. Par exemple, si vous atteignez 10 000, l'ajout de 0,0001 donnera le nombre le plus proche de 10 000,0001 qui peut être représenté, comme 10 000,025786 ou quelque chose comme ça.

Conformément à IEE765 Un double a 11 bits d'exposant et 52 bits de fraction.

Ainsi, lorsque vous associez un nombre de 52 bits à un exposant de 11 bits, vous obtenez un nombre assez important. Mais cela ne signifie pas que tous les nombres de cette plage, du plus petit au plus grand, peuvent être représentés avec précision, contrairement à un type entier.

2voto

user2079303 Points 4916

C++ pourquoi le maximum du double 64bit a 308 chiffres

Dans mon environnement (Win10 64bit

Parce que votre système utilise un matériel conforme à la spécification IEEE 754 (comme la plupart des matériels). Ce document spécifie que la plus grande valeur finie représentable de la virgule flottante binaire de 64 bits est 2. 1024 ce qui est un peu moins que 1,8 E308.


sizeof(double) est de 8 octets, la valeur maximale devrait être 1.84e19

Il y a environ 1,84e19 nombres entiers positifs qui sont représentables par 8 octets. Supposez-vous que double est un type d'entier non signé ? Ce n'est pas le cas, donc votre hypothèse est erronée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X