2010-08-19 6 views

Répondre

2

Oui.

Supposons que le dépassement se produise à 100, par souci de simplicité.

a * b >= 100, nous avons trop-plein

Par conséquent, pour a = n, si b >= 100/n, nous avons trop-plein. Si a ou b est 0, vous n'avez pas de débordement.

Cela ne fonctionnera pas pour toute configuration mathématique qui doit augmenter la constante de droite, car votre détection de débordement débordera. Cependant, n'importe quelle étape d'une opération peut déborder, donc vous devez vraiment vérifier chaque addition et multiplication avant qu'elle n'arrive au niveau de la machine, plutôt que le niveau de l'algorithme. Ergo, vous aurez besoin de partitionner votre problème dans les plus petites quantités connues pour utiliser efficacement cette détection de débordement.

Je préférerais laisser la langue lancer une exception, mais c'est juste moi.

+0

Il est probablement moins cher à la fin de la journée pour laisser la langue, sauf (dans des circonstances exceptionnelles) que de sauter à travers des cerceaux en essayant de couvrir tous les cas qui pourraient déborder, aussi bien. –

+0

Malheureusement, les anciennes langues ne prennent pas cette route, et heureusement, les plus récentes n'ont tout simplement pas ce problème, sauf si vous manquez de mémoire: P –

+0

"Sauf si vous manquez de mémoire" est-ce exact? Des exceptions de débordement se produisent lorsqu'une opération arithmétique produit un résultat en dehors de la plage du type de données renvoyé par l'opération. –

0

Activez la protection anti-débordement, puis appliquez l'opération. Si une exception de débordement est levée, ou si un registre d'erreurs obtient un bit de débordement, ou si votre environnement vous informe du problème, vous savez que si vous le faites à nouveau, vous aurez un débordement.

+0

Toutes les machines ne possèdent pas cette fonctionnalité. –

0

Pour somme:

MAX_NUMBER - A < B 

il y aura un débordement

+1

Si A est négatif alors vous aurez un débordement dans votre test –

+0

@Paul R Vous avez raison, il est nécessaire de vérifier si A> 0. Et de vérifier si les deux sont négatifs si débordent le MIN_NUMBER. –

Questions connexes