c ++ pow (2,1000) est normal à gros pour le double, mais ça marche. Pourquoi?
le code:
#iclude <math.h>
int main(){
double somenumber = pow(2, 1000);
printf("%lf\n", somenumber);
return 0;
}
- je obtenir ce nombre énorme:
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
C'est évidemment de gros pour le double. Comment cela fonctionne?
source d'informationauteur 0xbadc0de
Vous devez vous connecter pour publier un commentaire.
21000 est dans la plage de numéros peut être représenté par un double. Si ce nombre n'est évidemment pas trop grand pour une chambre double.
Je soupçonne que ce que tu veux dire par "trop gros", c'est que le nombre de chiffres imprimés est beaucoup plus grand que le 16 ou plus chiffres qui peuvent être stockées dans un double. Il n'y a rien de mal à demander à un ordinateur pour imprimer plus de 16 chiffres décimaux. Ce qui est faux est à supposer que ces chiffres supplémentaires ont pas de sens.
Dans ce cas particulier, le numéro imprimé est tout à fait correct. C'est parce que l'ordinateur traite
pow(2,some_int)
spécialement. Des puissances de 2, peut être représenté exactement dans un double. L'algorithme utilisé pour calculer la représentation décimale exacte de l'intégrale de la valeur de donner l'exacte représentation décimale.Autre chose, tous les paris sont éteints. Modifiez votre programme de sorte qu'il imprime 3646 par exemple:
Il sera toujours l'impression d'un grand nombre de temps, mais seuls les 16 premiers ou si les chiffres sont correctes.
double
a généralement 11bit pour exp (-1022~1023 normalisée), 52bit de fait et de 1bit pour signer. Ainsi, il est tout simplement trop grand.Pour plus d'explication, voir La norme IEEE 754 sur Wikipédia
C'est une puissance de deux, et de la virgule flottante sont essentiellement stockées comme des (multiples) des puissances de deux.
De même, dans le système décimal, il ne devrait pas vous surprendre que cela prend très peu de place pour représenter 101000 précisément, mais une telle concis notation ne serait pas possible pour les grandes puissances d'autres valeurs, comme la 31000 = 1322070819480806636890455259752144365965422032752148167664920368226828597346704899540778313850608061963909777696872582355950954582100618911865342725257953674027620225198320803878014774228964841274390400117588618041128947815623094438061566173054086674490506178125480344405547054397038895817465368254916136220830268563778582290228416398307887896918556404084898937609373242171846359938695516765018940588109060426089671438864102814350385648747165832010614366132173102768902855220001.