/ / Vous cherchez un exemple canonique de ce problème de débordement - c, overflow

Vous cherchez un exemple canonique de ce problème de débordement - c, overflow

Cela est apparu récemment dans une interview (le concept) et j'en discutais avec un ami aujourd'hui. Voici l’idée:

Supposons que vous calculiez le produit scalaire d'un vecteur tridimensionnel. La fonction simple serait "return (x1 * x2) + (y1 * y2) + (z1 * z2)".

Cependant, si les premier et deuxième mandats sont importantsles nombres positifs, ils pourraient déborder même s'ils répondent est dans la fourchette acceptable. Par exemple, supposons que la limite de nombre entier soit 128. 100 + 100 - 80 = 120, mais si vous faites d’abord les deux premiers ajouts, vous allez déborder.

Dans une classe universitaire, cela s'est produit sur un Caffectation où nous calculions quelque chose que nous avions probablement déjà fait mille fois mais que nous n’avions jamais fait attention au débordement (c’était la partie où nous apprenions à écrire du code sanitaire), comme prendre une moyenne ou quelque chose du genre.

Quelqu'un at-il une idée dans quel contexte cela aurait pu se produire? Je sais que dans certaines situations, vous deviez utiliser des comparaisons soit avant, soit à la place de l'addition / soustraction pour éviter ce débordement.

Réponses:

3 pour la réponse № 1

La recherche binaire est un exemple classique. De nombreuses implémentations font un calcul qui "trouve fondamentalement le point médian de deux indices: (haut + bas) / 2 mais si haut et bas sont chacun près d'Integer.MAX_VALUE ou l'équivalent pour votre langue, des débordements haut + bas avant la division peuvent se produire et votre réponse est fausse:

http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

La solution facile est dans ce cas à faire: haut / 2 + bas / 2 au lieu de cela, cela ne "déborde pas, mais c’est un bogue presque universel dans les implémentations de la recherche binaire, et c’est la première chose à retenir quand on parle d’un débordement dans un calcul qui devrait aboutir à un non débordement valeur.