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

EmKa69 10 Messages postés mardi 30 septembre 2008Date d'inscription 3 décembre 2009 Dernière intervention - 13 août 2009 à 16:32 - Dernière réponse : EmKa69 10 Messages postés mardi 30 septembre 2008Date d'inscription 3 décembre 2009 Dernière intervention
- 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
____________________
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 16 août 2009 à 13:53
3
Merci
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.

Merci us_30 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de us_30
cs_loulou69 672 Messages postés mercredi 22 janvier 2003Date d'inscription 2 juin 2016 Dernière intervention - 13 août 2009 à 17:00
0
Merci
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
Commenter la réponse de cs_loulou69
EmKa69 10 Messages postés mardi 30 septembre 2008Date d'inscription 3 décembre 2009 Dernière intervention - 13 août 2009 à 17:06
0
Merci
Oui on peut faire
2^2.1
(-2)^2
Mais pas (-2)^2.1
Quelqu'un connait une solution?
Commenter la réponse de EmKa69
cs_loulou69 672 Messages postés mercredi 22 janvier 2003Date d'inscription 2 juin 2016 Dernière intervention - 13 août 2009 à 17:16
0
Merci
"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)
Commenter la réponse de cs_loulou69
EmKa69 10 Messages postés mardi 30 septembre 2008Date d'inscription 3 décembre 2009 Dernière intervention - 13 août 2009 à 17:23
0
Merci
Donc si j'ai compris:
a^b
peut aussi s'ecrire
10^b*log(a)/log(10)

Je vais essayer


EmKa
Commenter la réponse de EmKa69
cs_loulou69 672 Messages postés mercredi 22 janvier 2003Date d'inscription 2 juin 2016 Dernière intervention - 13 août 2009 à 17:31
0
Merci
j'ai quand quelques doutes,

http://fr.wikipedia.org/wiki/Puissance_(math%C3%A9matiques_%C3%A9l%C3%A9mentaires)

x puiss y = exp (y * ln(x))

ln : logarithme népérien
http://fr.wikipedia.org/wiki/Logarithme_n%C3%A9p%C3%A9rien
Commenter la réponse de cs_loulou69
EmKa69 10 Messages postés mardi 30 septembre 2008Date d'inscription 3 décembre 2009 Dernière intervention - 13 août 2009 à 17:37
0
Merci
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.
Commenter la réponse de EmKa69
cs_loulou69 672 Messages postés mercredi 22 janvier 2003Date d'inscription 2 juin 2016 Dernière intervention - 13 août 2009 à 17:40
0
Merci
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
Commenter la réponse de cs_loulou69
EmKa69 10 Messages postés mardi 30 septembre 2008Date d'inscription 3 décembre 2009 Dernière intervention - 13 août 2009 à 18:33
0
Merci
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
Commenter la réponse de EmKa69
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 15 août 2009 à 22:57
0
Merci
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.
Commenter la réponse de us_30
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 16 août 2009 à 15:36
0
Merci
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.
Commenter la réponse de us_30
EmKa69 10 Messages postés mardi 30 septembre 2008Date d'inscription 3 décembre 2009 Dernière intervention - 16 août 2009 à 16:14
0
Merci
Ok merci pour ta reponse

EmKa
Commenter la réponse de EmKa69

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.