Division par 0

Résolu
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 26 avril 2011 à 02:13
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 26 avril 2011 à 14:34
Salut à tous

à propos des divisions par 0
J'ai le code suivant

Dim x As Double
Dim y As Double
x = 0
Try
   y = 1 / x
   MessageBox.Show(y)
   Catch ex As Exception
   MessageBox.Show(ex.Message)
 End Try                


l'exception n'est pas relevé bien que x = 0
parce que y est definit double si y est integer l'exception est relevé
comment peut on relevé une exception meme si y
est definit comme double

merci

6 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
26 avril 2011 à 13:35
Je ne t'avais pas dit de rendre ta variable 'y' Integer, mais de tenter un Debug.Print avec cette conversion, ce qui est complètement différent, n'altère pas le contenu de ta variable et répond à ta question initiale.
3
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
26 avril 2011 à 09:36
Salut

En effet, surprenant que 'y' affiche tranquillement "+Infini".
Encore une nouveauté .Net !
Solution :
Faire l'opération et tenter d'afficher 'y' converti en entier :
        y = 1 / x
        Try
            Debug.Print(CInt(y))
            MessageBox.Show(y)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
[img]http://allproj
0
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 56
26 avril 2011 à 12:01
Salut
c'est peut etre une solution mais avec cint
on perd une partie de y
par ex
Dim x As Integer
Dim y As Double
Dim result As New List(Of Double)
For x = 0 To 10
    Try
       y = CInt(1 / x)
       result.Add(y)
     Catch ex As Exception
           MessageBox.Show(ex.Message)
     End Try
 Next


dans ce cas l'exception est relevé mais la list result contient que des 0

si je supprime la conversion dans la list j'ai (0) 1.#INF alors j'ai essayé d'écrire
If y.ToString <> "1.#INF" Then
    result.Add(y)
 End If     


ça ne marche pas avec le debugger quand x = 0
y.tostring = "infinty" (cela dépend du langage
qui est definit chez moi en anglais ) et non "1.#INF"
si on écrit
if y <> 1.#INF THEN
erreur identifier expected #
je cherche encore l'astuce
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 20
26 avril 2011 à 12:14
ça montre simplement que les valeurs étant des constantes, la division n'est pas codée car le résultat est précalculé.

Dans tous les cas on ne fait pas une gestion d'exception (au moins 200 cycles) alors qu'un pauvre test sur le diviseur (IF == 0.0) suffirait.
.NET est déjà assez lourd, inutile de lui mettre des boulets aux pieds.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
26 avril 2011 à 12:49
Bonjour à tous,

Ceci est dû à la norme IEEE 754 qui définit qu'une division par 0 de nombres à virgule flottante donne un résultat qui tend vers l'inifini.

En utilisant le type Decimal vous n'aurez pas ce problème. Meme si je rejoinds BruNews sur le fait que catcher l'exception n'est pas la solution.
0
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 56
26 avril 2011 à 14:34
Merci à tous
j'ai résolu le prob avec le conseil de Jack
0