2010-11-23 51 views
0

Comment représenter des valeurs qui dépassent les valeurs maximales d'un type de données particulier (int, long)? Je pense à un autre espace de stockage agissant comme un compteur. Une fois la valeur maximale franchie, le compteur se met à jour pour indiquer que la variable a dépassé la limite pour "x" nombre de fois. Y a-t-il un autre moyen efficace de le faire?Comment représenter un nombre supérieur à la valeur maximale

Comment pouvons-nous afficher la valeur exacte?

P.S: Juste une question hypothétique.

Répondre

2

Une manière consiste à découper réellement l'une des valeurs à cet effet. Par exemple, si vous avez un type intégral de 16 bits pouvant représenter les valeurs comprises entre 0 et 65535 inclus, réduisez la plage de 0 à 65534 et utilisez 65535 pour représenter la valeur "too big darned".

Vous devez faire attention à contrôler les opérations afin qu'elles ne produisent pas cette valeur dans le cours normal des événements, mais cela est raisonnablement facile si votre langage fournit des fonctionnalités de classe.

Vous pouvez utiliser le suivant le plus grand type de données telles que long pour int ou long long pour long et utiliser la gamme supplémentaire pour stocker des informations. Et, si vous avez besoin de plus que cela, vous pouvez coder une bibliothèque bignum (ou en utiliser une qui existe déjà) afin qu'il n'y ait pas de limites artificielles placées sur vos numéros.

1

Tenir compte d'une norme IEEE float-754 et les "Infinity" bit-modèles. On pourrait réserver un modèle binaire similaire dans un int fixe/long pour signifier "Infinity". Cependant, le CPU ne vous aidera pas sur les états mathématiques/débordement comme la plupart des FPU. Certains langages comme Ruby ou Elisp contiennent déjà des bits de "réserve" en nombres entiers (par exemple, un fixnum dans Ruby est limité à [-2^29,2^29-1] car 2 bits sont utilisés pour le nettoyage de l'objet). L'utilisation d'un motif de bits spécifique par rapport au bit ne supprimerait qu'une seule valeur potentielle.

Si vous parlez des langues de niveau supérieur, disons, C#, il est facile de définir un type personnalisé:

struct IntWithStuff { 
    int value; 
    bool isTooBig; 
} 

Vous pouvez aussi surcharger les différents opérateurs et mettre en œuvre une (explicite) moulages, mais Je m'écarte ...