Probleme avec l'opérateur exposant [Résolu]

Signaler
Messages postés
10
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 décembre 2009
-
Messages postés
10
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 décembre 2009
-
Bonjour à tous,
avec Visual basic express, j'ai un problème quand je veux élever un nombre négatif à une puissance réél.
Exemple
(-1)^(2.1)
renvoie -1.#ind

Est-ce que vous connaissez un "remède" ou une alternative.
Merci d'avance.

EmKa
____________________

12 réponses

Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Re,

Dès qu'on s'intéresse au puissance supérieure à 1, par exemple (-2)^(5/3) [qui pose encore problème sous VBE] mon algo précédent n'est pas adapté. La solution que j'ai trouvé consiste à décomposer l'exposant en partie entiere+décimale. Ainsi : (-2)^(5/3) = ((-2)^5)^(1/3) = (-32)^(1/3) = -3,1748021039364...

Voici algorithme complet testé pour tous les exposants cette fois :

Function Puiss(Nb As Double, Expo As Double) As Double
' FONCTION EXPOSANT TENANT COMPTE DES D'ARGUMENTS TEL QUE (-2)^(1/3) ou (-2)^(5/3) SANS ERREUR

'Paramètres
Dim A As Double
Dim B As Double
Dim P As Double
Dim E As Double
Dim C As Double
Dim D As Double
Dim G As Double
Dim H As Double
P = 10 ^ -15

'Algo décomposition Expo
A = Int(Expo)
E = Int(Expo)
B = 1
C = 1
D = 0
G = Expo

While Abs(Expo - A / B) > P
    G = 1 / (G - E)
    E = Int(G)
    H = A * E + C
    C = A
    A = H
    H = B * E + D
    D = B
    B = H
Wend

'Calcul exposant entier
Nb = Nb ^ A

'Calcul exposant decimal
If Abs(1 / B) < 1 And (B And 1) Then
    Puiss = Sgn(Nb) * Abs(Nb) ^ (1 / B)
Else
    Puiss = Nb ^ (1 / B)
End If

End Function

Sub es()

Debug.Print Puiss(-2, 1 / 3) '-1,25992104989487
Debug.Print Puiss(-2, 5 / 3) '-3,1748021039364
Debug.Print Puiss(-2, -5 / 3) '-0,314980262473718

End Sub



Amicalement,
Us.
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
Bonjour
C'est bien réelle
2.1 c'est un nombre réel
En vb6 j'ai erreur 5 :appel de procédure incorrect
-1.#ind serait un code d'erreur
Messages postés
10
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 décembre 2009

Oui on peut faire
2^2.1
(-2)^2
Mais pas (-2)^2.1
Quelqu'un connait une solution?
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
"a puissance b" se calcule ainsi "10 puissance b * log en base 10 de(a)" pour des nombres réels

et Log en base n d'un nombre x s'obtient avec
Logn(x)=Log(x)/log(n)
Messages postés
10
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 décembre 2009

Donc si j'ai compris:
a^b
peut aussi s'ecrire
10^b*log(a)/log(10)

Je vais essayer


EmKa
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
Messages postés
10
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 décembre 2009

J'ai le même résultat.
J'ai vu sur un autre forum que le problème viens justement du fait que vb passe par le log pour calculer les puissances négatives.
Il doit y avoir une autre façon de faire. Mais je ne l'ai pas encore trouvée.
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
le problème c'est que la fonction Log n'accepte pas des valeurs négatives , elle n'est définie que pour des valeurs positive, si tu as fait des math ,regarde le tracé de la fonction log (elle y ait sur une des 2 pages dsipedia précédente). aie aie
Messages postés
10
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 décembre 2009

Oui donc il doit y avoir une autre façon de calculer.
par exemple:
(-1)^(1/3)=-1 (racine cubique de -1)
et pourtant vb renvoie un défaut.



EmKa
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Bonsoir,

Intéressante limitation de VB que je ne connaissais pas.

Voici une fonction perso réglant le problème :

Function Puiss(Nb As Double, Expo As Double) As Double
' FONCTION EXPOSANT TENANT COMPTE DES D'ARGUMENTS TEL QUE (-2)^(1/3) SANS ERREUR
If Abs(Expo) < 1 And ((1 / Expo) And 1) Then
    Puiss = Sgn(Nb) * Abs(Nb) ^ Expo
Else
    Puiss = Nb ^ Expo
End If

End Function



Amicalement,
Us.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
A oui, il m'empêche que pour la question de départ, il est normal que (-1)^2.1 bug ! puisque le résultat n'est pas un nombre réel pure (partie imaginaire nulle). En effet, (-1)^2.1 = 0.95105651629515364 + 0.30901699437494717*i, avec i²=-1...

J'ai testé avec mon algo, il donne bien le résultat attendu... c'est à dire qu'il bug !... Logique... avec (-1)^2.2 ou (-1)^2.4 on a bien les résultats attendus : -1 et 1.... etc...

Amicalement,
Us.
Messages postés
10
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 décembre 2009

Ok merci pour ta reponse

EmKa