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

VB.NET Discussion :

Retour de fonction bizarre


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Par défaut Retour de fonction bizarre
    Bonjour,

    Voilà mon problème. Je vous explique le contexte, pour que vous compreniez à peu près ce que fait mon code, mais mon problème est purement "informatique" (ce ne sont pas les calculs qui posent problème).

    J'ai défini un type "obligation" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Public Structure Obligation
            Dim Maturity As Double
            Dim Coupon As Double
            Dim Price As Double
        End Structure
    puis une fonction "prixObligation(obligation, taux)" permettant de calculer le prix de l'obligation en fonction d'un taux de rendement.

    Vient maintenant mon problème. J'ai créé cette fonction récursive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Function tauxActuarielMethodeFaussePosition(ByVal obli As Obligation, ByVal tauxA As Double, ByVal tauxB As Double) As Double
            Dim epsilon As Double = 10 ^ (-4)
            Dim valeurA As Double = prixObligation(obli, tauxA) - obli.Price
            Dim valeurB As Double = prixObligation(obli, tauxB) - obli.Price
            Dim tauxC As Double = tauxA - valeurA * (tauxB - tauxA) / (valeurB - valeurA)
     
     
            If (Math.Abs(tauxB - tauxA) > epsilon) Then
                Dim valeurC As Double = prixObligation(obli, tauxC) - obli.Price
                If ((valeurA * valeurC) < 0) Then
                    tauxActuarielMethodeFaussePosition(obli, tauxA, tauxC)
                Else
                    tauxActuarielMethodeFaussePosition(obli, tauxC, tauxB)
                End If
     
            Else
                DataRead.Text = tauxC.ToString()
                Return tauxC
            End If
        End Function
    J'appelle cette fonction dans une autre procédure ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim aux As Double = tauxActuarielMethodeFaussePosition(obli, 0, 100)
    DataRead2.Text = aux.ToString()
    Le résultat obtenu sur mon label "DataRead" est "1.89" (ce qui exactement ce que j'attends). Mais le label "DataRead2" m'affiche "0" !!

    Pourquoi donc ?

    J'ai passé plusieurs heures à tout décortiquer pour savoir d'où ça vient, et je ne trouve toujours pas ! Pouvez-vous m'aider ?

  2. #2
    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
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Function tauxActuarielMethodeFaussePosition(ByVal obli As Obligation, ByVal tauxA As Double, ByVal tauxB As Double) As Double
            Dim epsilon As Double = 10 ^ (-4)
            Dim valeurA As Double = prixObligation(obli, tauxA) - obli.Price
            Dim valeurB As Double = prixObligation(obli, tauxB) - obli.Price
            Dim tauxC As Double = tauxA - valeurA * (tauxB - tauxA) / (valeurB - valeurA)
     
     
            If (Math.Abs(tauxB - tauxA) > epsilon) Then
                Dim valeurC As Double = prixObligation(obli, tauxC) - obli.Price
                If ((valeurA * valeurC) < 0) Then
                    Return tauxActuarielMethodeFaussePosition(obli, tauxA, tauxC)
                Else
                    Return tauxActuarielMethodeFaussePosition(obli, tauxC, tauxB)
                End If
     
            Else
                DataRead.Text = tauxC.ToString()
                Return tauxC
            End If
        End Function
    ?

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Par défaut
    L'algorithme est le suivant :

    On note f(x) = prix calculé de l'obligation avec le taux x - prix de l'obligation coté. Le but du jeu est de trouver x tel que f(x)=0 (ie le taux x qui permet de retrouver le prix coté de l'obligation). On va utiliser la méthode dite "de Newton simplifié".

    Le prix de l'obligation coté est contenu dans le champ Price du type Obligation. Le prix calculé est celui renvoyé par la fonction prixObligation.

    Initialisation : on considère un tauxA = 0 et un tauxB = 100.

    Etape1 : On calcule f(tauxA) et f(tauxB). On définit tauxC = tauxA - f(tauxA)*(tauxB-tauxA)/(f(tauxB)-f(tauxA)).

    Etape2 : si |tauxB - tauxA| < epsilon, renvoyer tauxC. Sinon refaire Etape1 avec comme nouveau tauxA le tauxA et comme nouveau tauxB le tauxC si f(tauxA) et f(tauxC) sont de signes opposés. Sinon refaire Etape1 avec comme nouveau tauxA le tauxC et comme nouveau tauxB le tauxB.

  4. #4
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut
    -> smyley : non c'est pas le manque du return, car en fait, si j'ai bien compris il ne veut sortir que quand la condition est fausse.

    -> Dizayeure : Je pense que c'est du au fait que c'est la multitude d'appel de la meme function a partir de elle meme qui pose le probleme.
    En fait, tu re-appelles ta function sans avoir retourne quoi que ce soit et je pense que c'est ca qui doit faire le bordel.

    Comme ca, sans trop reflechir je sortirais ta recur dans une autre function qui sera appele dans ta function originale.

  5. #5
    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 Danyel Voir le message
    -> smyley : non c'est pas le manque du return, car en fait, si j'ai bien compris il ne veut sortir que quand la condition est fausse.
    Bah quand je regarde je vois une fonction récursive qui renvoi pas forcément quelque chose :
    On suppose être dans tauxActuarielMethodeFaussePosition.
    Si "(Math.Abs(tauxB - tauxA) > epsilon)" alors on a le code
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Function tauxActuarielMethodeFaussePosition(ByVal obli As Obligation, ByVal tauxA As Double, ByVal tauxB As Double) As Double
            ...
            If (Math.Abs(tauxB - tauxA) > epsilon) Then
                Dim valeurC As Double = prixObligation(obli, tauxC) - obli.Price
                If ((valeurA * valeurC) < 0) Then
                    tauxActuarielMethodeFaussePosition(obli, tauxA, tauxC)
                Else
                    tauxActuarielMethodeFaussePosition(obli, tauxC, tauxB)
                End If
     
                -> fin de la fonction ici, sans aucun Return et peut être que le vb permet mais dans ce cas la fonction renvoi quoi ?
            Else
                ...
            End If
        End Function


    Si on suit la récursion, la dernière étape a la varible tauxC qui contient la bonne valeur, mais en remontant les appels les tauxC précédents (dans la récursion) ne sont pas modifiés et au final le tauxC renvoyé est celui calculé par le premier appel, pas par le dernier.

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Par défaut
    En effet, comme vous l'avez dit, c'est ma récurrence qui merdoie à fond.

    J'ai tout recodé avec un 'while', rendant le code bien plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
        'Fonctions permettant de calculer le taux actuariel en % de l'obligation 'obli'
        Function tauxActuarielMethodeFaussePosition(ByVal obli As Obligation, ByVal tauxA As Double, ByVal tauxB As Double) As Double
            Dim epsilon As Double = 10 ^ (-4)
            Dim valeurA As Double = prixObligation(obli, tauxA) - obli.Price
            Dim valeurB As Double = prixObligation(obli, tauxB) - obli.Price
            Dim tauxC As Double = tauxA - valeurA * (tauxB - tauxA) / (valeurB - valeurA)
     
     
            While (Math.Abs(tauxB - tauxA) > epsilon)
                valeurA = prixObligation(obli, tauxA) - obli.Price
                valeurB = prixObligation(obli, tauxB) - obli.Price
                tauxC = tauxA - valeurA * (tauxB - tauxA) / (valeurB - valeurA)
                Dim valeurC As Double = prixObligation(obli, tauxC) - obli.Price
                If ((valeurA * valeurC) < 0) Then
                    tauxB = tauxC
                Else
                    tauxA = tauxC
                End If
            End While
     
            Return tauxC
        End Function
    Ce coup-ci, tout marche nickel !

    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Perte de type en retour de fonction
    Par Bebel dans le forum Langage
    Réponses: 8
    Dernier message: 22/12/2005, 12h54
  2. [syntaxe] tableau et retour de fonction
    Par BainE dans le forum C++
    Réponses: 4
    Dernier message: 08/12/2005, 16h01
  3. Retour de fonction en C
    Par troumad dans le forum Linux
    Réponses: 2
    Dernier message: 06/11/2005, 21h43
  4. Utilisation d'un retour de fonction dans un decode
    Par CFVince dans le forum Oracle
    Réponses: 4
    Dernier message: 20/10/2005, 17h22
  5. Référence en retour de fonction, à transformer en hash
    Par raoulchatigre dans le forum Langage
    Réponses: 4
    Dernier message: 15/07/2005, 14h24

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