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é
Répondre
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.
Intéressant. Alors pourrais-je retourner + Inf/-Inf/Nan et éviter la division par zéro exception levée par la FPU? – GabiMe
C'est une option permise par la norme, oui. – MSalters
@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
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.
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é)
Comment les flotteurs d'ieee corrigent-ils déjà cela? – GabiMe
Voir la réponse de mouviciel. –
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.
- 1. Programme de sécurité - Division de fichiers
- 2. comment regrouper la division de données par fonction de division
- 3. C#: Enfilez fonction de sécurité
- 4. Manipulation de la fonction de division pour deux baies
- 5. sécurité de fil de fonction strtok
- 6. Fonction C++ C# (code de sécurité)
- 7. propriétés de division entière
- 8. problèmes de division
- 9. Division de chaînes Python
- 10. Division de chaînes
- 11. Division de chaînes/jetons
- 12. comment écrire une fonction pour implémenter un algorithme de division entière sans utiliser l'opérateur de division dans php
- 13. problème de division de gamme
- 14. Compatibilité de l'applet Java avec la fonction de sécurité IE8
- 15. Python/Numpy: tableau de division
- 16. Division de PDF en png
- 17. RSS parsing, chaîne de division
- 18. Division de NSString dans IPhone
- 19. Division de titres dans DropDown
- 20. terme par division division en python (division termino en termino en python)
- 21. Placement d'une division à l'intérieur d'une division
- 22. division entière vs double division - question d'optimisation
- 23. Division de documents Word avec VBA
- 24. Manipulation de chaînes: Division de données délimitées
- 25. GCC compile erreur de division de temps
- 26. Opérations de division de chaîne en C#
- 27. Exemple de somme et de division (Python)
- 28. sécurité et mail() fonction dans php
- 29. Division par zéro erreurs
- 30. La fonction de clic de division parent est appelée lorsque l'on clique sur Clic enfant
Qu'est-ce qui ne va pas avec un bloc try/catch? –
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
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