Probleme avec l'opérateur exposant

Résolu
EmKa69 Messages postés 10 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 décembre 2009 - 13 août 2009 à 16:32
EmKa69 Messages postés 10 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 décembre 2009 - 16 août 2009 à 16:14
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

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
16 août 2009 à 13:53
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.
3
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
13 août 2009 à 17:00
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
0
EmKa69 Messages postés 10 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 décembre 2009
13 août 2009 à 17:06
Oui on peut faire
2^2.1
(-2)^2
Mais pas (-2)^2.1
Quelqu'un connait une solution?
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
13 août 2009 à 17:16
"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)
0

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

Posez votre question
EmKa69 Messages postés 10 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 décembre 2009
13 août 2009 à 17:23
Donc si j'ai compris:
a^b
peut aussi s'ecrire
10^b*log(a)/log(10)

Je vais essayer


EmKa
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
13 août 2009 à 17:31
0
EmKa69 Messages postés 10 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 décembre 2009
13 août 2009 à 17:37
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.
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
13 août 2009 à 17:40
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
0
EmKa69 Messages postés 10 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 décembre 2009
13 août 2009 à 18:33
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
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
15 août 2009 à 22:57
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.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
16 août 2009 à 15:36
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.
0
EmKa69 Messages postés 10 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 décembre 2009
16 août 2009 à 16:14
Ok merci pour ta reponse

EmKa
0
Rejoignez-nous