Division par 0 [Résolu]

cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 26 avril 2011 à 02:13 - Dernière réponse : cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention
- 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
Afficher la suite 

6 réponses

Répondre au sujet
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 26 avril 2011 à 13:35
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 26 avril 2011 à 09:36
0
Utile
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
Commenter la réponse de cs_Jack
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 26 avril 2011 à 12:01
0
Utile
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
Commenter la réponse de cs_ShayW
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 26 avril 2011 à 12:14
0
Utile
ç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++
Commenter la réponse de BruNews
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 26 avril 2011 à 12:49
0
Utile
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.
Commenter la réponse de foliv57
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 26 avril 2011 à 14:34
0
Utile
Merci à tous
j'ai résolu le prob avec le conseil de Jack
Commenter la réponse de cs_ShayW

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.