IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

division par 0 c#


Sujet :

C#

  1. #21
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par Uther Voir le message
    Parfois l'infini ou NaN peut avoir un sens particulier qui t'interesse, si ce n'est pas le cas, tu dois le traiter.
    La différence est que au lieu de traiter l'exception tu testes si tu as l'infini ou NaN.
    Si dans ce cas on a un programme dans lequel l'infini à un sens, on ne devrait donc pas être surpris que tel ou tel opération retourne l'infini plutot que de lever une exception ... ce qui me pousse à dire que normallement un programme n'est pas cencé contenir un nombre infini ou un nombre n'en étant pas un ( ... NaN ) d'où le besoin de vérifier. Sinon, on peut très bien se passer de se genre de vérifications.

  2. #22
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par Uther Voir le message
    En math on m'a appris que -1/0 = -oo n'est pas correct.
    Dans IR (l'ensemble des réels), en effet. Mais dans "IR barre" (l'ensemble des réels avec les deux infinis), si.

  3. #23
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 735
    Par défaut
    smyley> Je crois que tu m'as mal compris. Je suis entièrement d'accord. On vérifie juste si on estime qu'on en à besoin.
    Je comprend juste que ca puisse choquer quelqu'un habitué à travailler avec les entiers.

    Guulh> Heureux de l'apprendre, j'ai du arreter les math trop tôt ou alors je n'ai pas du être assez attentif.

  4. #24
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par Guulh Voir le message
    dans "IR barre"
    ça s'appelle "l'adhérence de R"

  5. #25
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Si dans ce cas on a un programme dans lequel l'infini à un sens, on ne devrait donc pas être surpris que tel ou tel opération retourne l'infini plutot que de lever une exception ... ce qui me pousse à dire que normallement un programme n'est pas cencé contenir un nombre infini ou un nombre n'en étant pas un ( ... NaN ) d'où le besoin de vérifier. Sinon, on peut très bien se passer de se genre de vérifications.
    infini ou NaN comme valeur de double c'est bien plus pratique que tester un exception.
    Ainsi tu peux séparer plus facilement une méthode faisant du calcul, et une de l'affichage.
    Par exemple gestion de l'affichage d'une courbe lorsque les valeur devienne infini. Pour une application qui affiche des courbes géométrique.
    Dans la partie affichage tu testes inifni.

    Si tu devais gérer cela par les exceptions tu serais embétés. Quelle valeur mettre dans ta variable pour qu'ensuite dans la méthode affichage on comprenne que c'est infini ?
    Gérer cela par un tableau à deux dimension pour tes valeurs ? Une dimensions la valeur, et une autre un booleen pour dire si c'est infini ou pas.

    Et puis en même temps lorsque tu fait une division par 9^-34. Tu as peut être envie d'arrondir à zéro car pour la reste du prog tu ne peux avoir une précision que de 10 chiffre après la virgule.
    Avec les double et infini c'est plus pratique du coup !!!!

  6. #26
    Membre chevronné
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Par défaut
    Ok, pas grand monde qui à répondu à ma question de départ, le sujet à un peu dérivé...

    Perso, je trouve pas terrible le retour de + ou - l'Infinie. Pourquoi limité le type int (sans ajouter les bornes + et - l'infini), et pourquoi on ajoute à l'ensemble R des réels les bornes + et - l'infini ? Pourquoi ne pas avoir la même chose dans les deux cas ?
    Il me semble qu'il y a un truc que pas logique, ou alors un truc que j'ai pas saisi...

  7. #27
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Pour moi c'est normal aussi avec des doubles, en effet depuis le début de l'informatique le calcul sur flottant ça n'a jamais été ça.

    Rien qu'à voir le fait qu'on ne puisse pas correctement comparer 2 flottants entre eux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine(0.1 * 0.1 - 0.01);
    Le bon sens voudrait un 0 tout simplement. Ben non.

    Pour la division le framework doit comparer le diviseur à 0 (selon Epsilon) et si il est +/- égal à 0 il retourne Infinity.

    Ceci n'est qu'une supposition bien entendu.

  8. #28
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 735
    Par défaut
    Citation Envoyé par oyigit Voir le message
    Ok, pas grand monde qui à répondu à ma question de départ, le sujet à un peu dérivé...

    Perso, je trouve pas terrible le retour de + ou - l'Infinie. Pourquoi limité le type int (sans ajouter les bornes + et - l'infini), et pourquoi on ajoute à l'ensemble R des réels les bornes + et - l'infini ? Pourquoi ne pas avoir la même chose dans les deux cas ?
    Il me semble qu'il y a un truc que pas logique, ou alors un truc que j'ai pas saisi...
    Si quasiment tous les langages fonctionnent comme cela c'est tout simplement que quasiment tous les processeurs courrants fonctionnent comme cela. Il serait bête de ne pas respecter les systèmes de fonctionnement reconnus par tous.
    Cela pourrait également avoir un prix en terme de performances vu qu'il faudrait systématiquement adapter le comportement du compilateur au processeur.

    Si les processeurs ont un comportement assez différents pour les entiers et les flottants c'est pour de des raison historiques, techniques et d'usage:
    • Le codage des entiers est un codage qui date de la préhistoire de l'informatique. Il est très simple et intuitif : il s'agit juste d'écrire le nombre sous forme binaire.
      La seule petite subtilité est le complément à deux(les négatifs codé en sens inverse des positifs) pour les nombres signés, qui permet de simplifer les opérations d'addition et de soustraction.
      Les opérations de dépassement de capacité ou de division par 0, retournent un résultat mais levent un flag dans un registre du processeur que C# pourra utiliser pour lever une exception.
    • Le codage standard des vigules flottante est plus récent. Il est davatage orienté vers les mathématiques et il est bien plus complexe car il peut se poser de nombreux problèmes (taille mantise/exposant, gestion des cas indéterminés, dépassement de capacité,...) avec encore plus de façons différentes de les résoudre. Il à donc été créé plusieur normes différentes qui définissent le codage et le comportement des opération sur ces nombres.
      La norme qui c'est imposé sur la majorité des compilateurs et processeurs standards modernes est la norme IEEE 754.
      Cette norme defini des valeur qui représenten des non nombres: +/-oo et Nan et impose aux opérations de division par 0 ou de dépassement de retourner ces valeurs.

  9. #29
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Par défaut
    Citation Envoyé par smyley Voir le message
    Mais c'est bizarre que celà suprenne les gens, pourquoi un réel divisé par 0 ne donnerai pas l'infini ? Pourtant en terminale on fait ça en math et ça donne les même résultats avec notamment les formes indéterminées et tout et tout ...
    Parce qu'on étudie le résultat de x/0 et non pas les limites en 0.

    Les limites ont été créées (je crois) pour connaître le comportement de certaines fonctions lors de cas indéterminés mathématiquement (la division par zéro n'étant pas "définie", les matheux ont décidé de dire quel est le comportement de cette fonction 1/x si on se rapproche le plus possible de 0, sans pour autant l'atteindre).

    En Mathématiques, on m'a toujours appris que diviser un nombre par zéro était impossible, mais on m'a appris que plus le chiffre se rapprochait de zéro, plus le résultat était grand (positif ou négatif, selon 0- ou 0+ blabla). Tu vois la différence ?

    ps : Elle sert à quoi l'exception DivideByZero si elle n'est jamais récupérée ? à faire joli ? oO (je suis tombé sur le même problème, l'exception n'est jamais "lancée")

  10. #30
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par casiii Voir le message
    Ps : Elle sert à quoi l'exception DivideByZero si elle n'est jamais récupérée ? à faire joli ? oO (je suis tombé sur le même problème, l'exception n'est jamais "lancée")
    C'est marqué au dessus, faut lire () : cette exception est balancée lors de la division par un ENTIER, parce qu'il n'existe pas de représentation dans le type "int" de l'infini. Le type "double" ayant des valeurs +Infinity et -Infinity, autant s'en servir.

  11. #31
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Citation Envoyé par Guulh Voir le message
    C'est marqué au dessus, faut lire () : cette exception est balancée lors de la division par un ENTIER, parce qu'il n'existe pas de représentation dans le type "int" de l'infini. Le type "double" ayant des valeurs +Infinity et -Infinity, autant s'en servir.
    Mince je voulais écrire la même chose mais au moment de faire post reply, la fenêtre à planter, et lorsque je suis revenue tu m'as grillé.

    Bon pour vous mettre tous d'accord sur division par zéro interdit ou non :
    Division by zero

    Division by zero is an operation for which you cannot find an answer, so it is disallowed. You can understand why if you think about how division and multiplication are related.
    12 divided by 6 is 2 because
    6 times 2 is 12

    12 divided by 0 is x would mean that
    0 times x = 12

    But no value would work for x because 0 times any number is 0. So division by zero doesn't work.
    De façon générale aller voir cette page :
    http://mathforum.org/dr.math/faq/faq.divideby0.html

  12. #32
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Et puis si vous voulez blamer quelqu'un à cause des divisions par zéro :
    Blamer les moines qui ont introduits au moyen age le chiffre 0 pour faciliter leurs opérations de comptabilité.

    (voilà j'ai réussi à le placer )

  13. #33
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 735
    Par défaut
    Enfin que la division par 0 soit mathématiquement acceptable ou pas, 1/0=+oo pour un float ou un double ne me gène pas vu que les float et double sont des valeurs approximées et absolument pas formelles.

  14. #34
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Citation Envoyé par oyigit Voir le message
    Ok, pas grand monde qui à répondu à ma question de départ, le sujet à un peu dérivé...

    Perso, je trouve pas terrible le retour de + ou - l'Infinie. Pourquoi limité le type int (sans ajouter les bornes + et - l'infini), et pourquoi on ajoute à l'ensemble R des réels les bornes + et - l'infini ? Pourquoi ne pas avoir la même chose dans les deux cas ?
    Il me semble qu'il y a un truc que pas logique, ou alors un truc que j'ai pas saisi...
    Au fait je me disais en koi on n'a pas répondu à ta question.
    Tu voulais savoir si la valeur infinity retourné c'est normal -> Oui et dit plus haut.
    Tu voulait connaître sont utilités. Je crois que l'on a apporté aussi une réponse à cela avec beaucoup d'avis.

  15. #35
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Par défaut
    Citation Envoyé par Guulh Voir le message
    qu'il n'existe pas de représentation dans le type "int" de l'infini. Le type "double" ayant des valeurs +Infinity et -Infinity, autant s'en servir.
    S'en servir pour dire que 1.0/0.0 => +Infinity ? Si 1/0 et 1.0/0.0 ne donnent pas le même résultat, cela peut vouloir dire que 0 != 0.0
    (un entier est un réel spécial, c'est de l'héritage )

  16. #36
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par casiii Voir le message
    S'en servir pour dire que 1.0/0.0 => +Infinity ? Si 1/0 et 1.0/0.0 ne donnent pas le même résultat, cela peut vouloir dire que 0 != 0.0
    (un entier est un réel spécial, c'est de l'héritage )
    Je suis désolé de te contedire deux fois d'affilée, mais au sens C#, un int n'est pas un double. Il existe une conversion implicite, mais la relation d'héritage (plus précisément d'inclusion) mathématique n'est pas vraie en POO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double i = 5 / 2; // i = 2
    double j = 5.0 / 2.0; // j = 2.5

  17. #37
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Citation Envoyé par casiii Voir le message
    cela peut vouloir dire que 0 != 0.0
    Oui tout comme 2 + 2 peuvent donner 5.. C'est ça l'informatique!

    Bon... Il faut surtout voir les choses autrement...

    short/int c'est pour "compter"
    float/double c'est pour "calculer"

    pour moi ca résume tout.

    En fait je vois pas pourquoi certains se prennent la tête... On a une valeur de retour, qui mathématiquement à un sens, je vois pas d'où vous vous plaignez...

    Et puis s'attendre à recevoir "logiquement" une Exception, c'est la preuve d'une erreur dans la conception... Comme dis plus haut, autant tester soi même la valeur à 0, c'est plus propre...

    C'est comme si je mettais des catch NullReferenceException partout car je sais que quelque chose va etre "null"...

  18. #38
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Et puis si vous voulez blamer quelqu'un à cause des divisions par zéro :
    Blamer les moines qui ont introduits au moyen age le chiffre 0 pour faciliter leurs opérations de comptabilité.
    Gnnnn ????

    Brahmagupta au Ve siécle. Ok, c'est limite du (très) haut MA/antiquité, mais aucun moine n'a à voir la dedans.

  19. #39
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Ok, c'est la wiki mais bon..

    http://fr.wikipedia.org/wiki/Zéro

    Je prend les devants pour tuer dans l'oeuf un nouveau débat (match) entre Bluedeep et Ced

  20. #40
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par casiii Voir le message
    Parce qu'on étudie le résultat de x/0 et non pas les limites en 0.
    Justement mais même si on a pas le droit de dire ça en math, c'est cohérent : plus on divise par quelque chose de petit, plus le resultat est grand donc quand on arrive à 0 on trouve l'infini

Discussions similaires

  1. Comment faire une division par 5 avec les decalages
    Par Zaion dans le forum Assembleur
    Réponses: 7
    Dernier message: 05/11/2004, 18h33
  2. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 14h41
  3. Division par 16 en C
    Par hermannd dans le forum C
    Réponses: 18
    Dernier message: 13/02/2004, 15h10
  4. [LG]a divise par b
    Par backsync dans le forum Langage
    Réponses: 8
    Dernier message: 22/10/2003, 22h37
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 19h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo