2010-04-08 6 views
1

Je voudrais définir une sorte de fonction de division sûre (et modulo), qui retournerait une valeur prédéfinie lorsque l'on tente de diviser par zéro. Je ne veux pas jeter des exceptions, juste pour retourner une valeur "raisonnable" (1? 0?) Et continuer le flux du programme. Évidemment, il n'y a pas de valeur de retour correcte, mais je me demande s'il existe une approche standard ou connueFonction de division de sécurité

+0

Qu'est-ce qui ne va pas avec un bloc try/catch? –

+0

que diriez-vous "int div (int un, int b, bool * bOK = 0);" Passer un pointeur à la booléenne si vous voulez savoir si le résultat était valide. – Thomi

+6

Plus le programme explose, mieux c'est, la dernière chose que je veux c'est que ça passe inaperçu. Il n'y a pas de taille «raisonnable» pour les morceaux d'une pomme qui sont divisés sans enfants. La "méthode standard" à ceci est de corriger votre erreur. – sbi

Répondre

2

La norme à virgule flottante IEEE définit les éléments à partir d'un division by zero.

  • + a/0 + Inf donne
  • + a/-0 donne -Inf
  • 0/0 donne NaN

Si vous travaillez avec des nombres entiers, vous pouvez utiliser cette norme pour définir votre propre routine, mais vous devez définir ce qui est Inf et ce qui est NaN dans la logique entière.

+0

Intéressant. Alors pourrais-je retourner + Inf/-Inf/Nan et éviter la division par zéro exception levée par la FPU? – GabiMe

+0

C'est une option permise par la norme, oui. – MSalters

+1

@bugspy: la valeur par défaut doit être que la FPU ne lance pas d'exceptions. Si vous posez des questions sur la PF, quelle est votre plateforme? – Potatoswatter

0

Vous pouvez renvoyer la valeur en tant que paramètre de sortie. Le type de retour de la fonction peut être booléen et vous renvoyez true en cas de succès et false en cas de division par zéro. Ensuite, vous vérifiez simplement pour vrai après la fonction. Mais l'approche moderne consiste à lancer une exception à la place et à l'attraper dans votre code client. Ensuite, vous pouvez choisir de l'ignorer si vous le souhaitez.

0

Je suppose que ceci est pour ints comme flotteurs déjà cette ieee fixent

le problème est que la valeur pourrait être « raisonnable » dépend de l'utilisation que vous devrez passer en exemple

DivOrDefault(int a, int b, int def) 
{ 
    if (b == 0) return def; 
    return a/b; 
} 

Sinon, vous pouvez signaler inf/Nan soit dans la bande (vous pouvez envelopper l'int dans une struct qui a également un bool pour .inf et ou nan) ou hors bande (comme m_pGaldiator suggéré)

+0

Comment les flotteurs d'ieee corrigent-ils déjà cela? – GabiMe

+0

Voir la réponse de mouviciel. –

6

Puisque vous êtes demandez C++ spécifiquement, vous pouvez faire

pair< int, bool > safe_div(int lhs, int rhs) { 
    if (rhs == 0 || lhs == INT_MIN && rhs == -1) return make_pair(0, false); 
    else return make_pair(lhs/rhs, true); 
} 

en alternance avec boost::optional

optional<int> safe_div(int lhs, int rhs) { 
    if (rhs == 0 || lhs == INT_MIN && rhs == -1) return optional<int>(); 
    else return lhs/rhs; 
} 

Je suppose que vous voulez une opération entière et j'ai ajouté une vérification pour le débordement.