Page 1 sur 1

[..]Tester si une variable est un nombre

Posté : mer. 01 sept. 2010 13:11
par pierrotm777
Bonjour,

Ce script calcul la pente d'une route en fonction de données GPS.
Je la calcule ainsi:

Code : Tout sélectionner

$pente = Round((Abs($alt2 - $alt1)/$distance)*100,0);pente calculée en pourcentage
ou $distance = distHaversine($lat1, $lon1, $lat2, $lon2)

la fonction du calcul de la distance (trouvée sur le forum US) est la suivante:
► Afficher le texte
J'essais de tester si une $pente est un nombre ou pas par ce que dans le calcul de la pente, mon résultat est parfois égal à -1.#IND.

J'ai donc testé cette boucle:

Code : Tout sélectionner

            $distance = distHaversine($lat1, $lon1, $lat2, $lon2)
            $pente = Round((Abs($alt2 - $alt1)/$distance)*100,0);pente calculée en pourcentage
            If Number($pente) Then
                GUICtrlSetData($Label9, "Slope: "&$pente)
            Else
                $pente = "??"
                GUICtrlSetData($Label9, "Slope: "&$pente)
            EndIf
Mais cela ne semble pas fonctionner.
Il semblerait que le problème arrive lorsque $alt2=$alt1.
Je ne comprend pas d'où cela peu bien venir.

Merci de votre aide

Re: [..]Tester si une variable est un nombre

Posté : mer. 01 sept. 2010 14:45
par jbnh
-1 est un nombre :| donc que voulez vous savoir réellement. si le résultat est positif ? Dans ce cas regardez si il est < que 0.

Vu que j'ai pas très bien compris : voici tjrs qqchose qui peux vous aider IsNumber()

Re: [..]Tester si une variable est un nombre

Posté : mer. 01 sept. 2010 17:24
par pierrotm777
Merci de votre réponse.
Je prend la valeur absolu de $alt2-$alt1, donc -1 n'est pas possible , enfin je crois !

Aprés quelque essais , je constate bien que mon problème existe quand Abs($alt2-$alt1)=0.

Il me faudrait donc tester l'existance de ce 0 puisque :
$pente = Round((0/$distance)*100,0), ça ne doit pas faire grand chose.

Re: [..]Tester si une variable est un nombre

Posté : mer. 01 sept. 2010 17:33
par pierrotm777
Je pense avoir trouvé ma solution en testant si Abs($alt2-$alt1)=0 .

Ce qui me donne :

Code : Tout sélectionner

$distance = distHaversine($lat1, $lon1, $lat2, $lon2)
If Abs($alt2 - $alt1)=0 Then
   $pente = "!!"
Else
   $pente = Round((Abs($alt2 - $alt1)/$distance)*100,0);pente calculée en pourcentage
EndIf
GUICtrlSetData($Label9, "Slope: "&$pente&"%")

Re: [..]Tester si une variable est un nombre

Posté : mer. 01 sept. 2010 17:52
par SrBelial
bon je pense que vous êtes sur la bonne voie, seulement pensez à vous méfier de deux choses :

que se passe t'il si $distance = 0 ? actuellement je pense que ça peut amener à une erreur ....

comment expliquer le résultat négatif ? en effet la valeur absolue de ($alt2 - $alt1) sera toujours positive,
cependant cela n'empêchera pas $pente d'être négatif .... son signe dépend directement de celui de $distance ...
à vous de voir si la fonction distHaversine($lat1, $lon1, $lat2, $lon2) peut vous renvoyer un nombre négatif ...

étant donné que cette fonction m'a tout l'air de fonctionner avec une pointe de trigonométrie, (du cosinus, du sinus, et tout le toutim) ... il y a de fortes chances pour que les résultats puissent être négatifs !!!

=> attention donc lorsque vous faites des calculs à prendre toutes les précautions qui s'imposent

Re: [..]Tester si une variable est un nombre

Posté : mer. 01 sept. 2010 18:16
par pierrotm777
Effectivement, au fait j'y pense seulement maintenant mais $distance est remis à 0 tous les 100m donc ça me fait une division par 0 !!! Ce qui n'est pas terrible .
Il faudrait que je teste aussi si $distance = 0

Re: [..]Tester si une variable est un nombre

Posté : mer. 01 sept. 2010 19:43
par Tlem
Une question = un sujet

Merci de ré-éditer votre message et de créer un nouveau sujet.