2009-04-17 8 views
17

Un double (d'un nombre donné d'octets, avec une balance mantisse/exposant raisonnable) peut-il toujours contenir exactement la plage d'un entier non signé de la moitié de ce nombre d'octets?Représentation d'entiers dans des doubles

E.g. un octet double de huit octets peut-il contenir exactement la plage de nombres d'un entier non signé de quatre octets?

Ce qui se résume à si un flottant de deux octets peut contenir la plage d'un int int non signé d'un octet.

un octet non signé volonté int bien sûr être égal à 0 -> 255.

Répondre

35

Un IEEE754 64 bits double peut représenter un entier de 32 bits, tout simplement parce qu'il a des bits 53-impair disponibles pour la précision et la 32 32 bits :-)

Il serait plausible qu'un nombre à virgule flottante de 64 bits (non double précision IEEE754) ait moins de 32 bits de précision. Cela permettrait des nombres vraiment énormes (en raison de l'exposant) mais au prix de la précision. La ligne de fond est que, à condition qu'il y ait plus de bits de précision dans la mantisse du nombre à virgule flottante que dans l'entier (et assez de bits dans l'exposant pour l'échelle), alors il peut être représenté sans perte de précision.

-3

Je n'utiliserais pas les mots «tout à fait précis» lorsque je parlerais de nombres à virgule flottante. Mais oui, un double peut représenter un entier de 32 bits.

Je ne sais pas quelles sont les autres combinaisons de flottants et d'entiers pour lesquels cela est également vrai. Pratiquement parlant, vous ne voulez pas utiliser le point flottant au-dessus de ce que votre machine supporte, il suffit donc de passer à l'arithmétique rationnelle avec bignums. De cette façon, vous avez la garantie de la précision.

+1

Un nombre à virgule flottante peut représenter précisément certains nombres, parmi lesquels figurent tous les entiers qui correspondent à sa précision. Une fois que vous commencez à faire de la division, ou une multiplication qui pourrait causer un débordement, vous avez probablement perdu de la précision. Tout le monde n'a pas non plus de système pratique pour les bignums et/ou les nombres rationnels. –

6

Oui. Un flottant (ou double) est garanti pour représenter exactement tout entier qui n'a pas besoin d'être tronqué. Pour un double, il y a 53 bits de précision, ce qui est plus que suffisant pour représenter exactement n'importe quel nombre entier de 32 bits, et une petite proportion (statistiquement parlant) de 64 bits aussi.

2

La précision de votre représentation dépend de nombreux facteurs dans votre implémentation, mais vous pouvez la limiter en disant que si le champ exposant est défini sur 0, vous pouvez représenter exactement les nombres entiers à la largeur de votre champ de mantisse (en supposant un bit de signe). Pour la double précision IEEE 754, cela signifie que vous pouvez représenter des nombres de 52 bits exactement. En général, votre mantisse dépassera la moitié de la largeur de la structure globale.

+0

Ne serait-il pas possible de représenter exactement un entier de 53 bits (pas de 52 bits), avec une mantisse de 52 bits, à cause du bit implicite à gauche du point binaire? – Apriori

Questions connexes