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

Langage Perl Discussion :

Diff entre un calcul dans une variable et l'impression du meme calcul à l'ecran!


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut Diff entre un calcul dans une variable et l'impression du meme calcul à l'ecran!
    Bonjour,

    j'ai un probleme que je ne comprend absolument pas...
    Ma procedure est censée me renvoyer une liste de 360 points d'un cercle dont je fourni le centre et le rayon en metres.
    Je me suis basé sur un code en PHP (je crois) dont un extrait est placé en commentaire dans ce code.

    Le probleme: la variable calculée $lonRad (longitude X en radians) reçoit toujours la meme valeur alors que le fait de faire un "print" de la formule de calcul me renvoit une valeur differente à chaque fois!!

    Je suis un peu perdu, si quelqu'un peut m'expliquer ce qu'il se passe

    Merci d'avance... bonne journée

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    sub creerCercle {
    # Renvoit une liste des points ("x,y") du cercle dont on fournit une coordonnée centrale et un rayon en metres
    # $modulo, si >0 permet de simplifier la liste de retour en ne calculant qu'un point sur $modulo
    my($centreX, $centreY, $rayon, $modulo) = @_;
    my @pointsCercle;
    $modulo = int($modulo);
    $modulo = 1 if ($modulo == 0);
     
    # Converti les coord en radians:
    $centreX = deg2rad($centreX);
    #print "X=$centreX rad\n";
    $centreY = deg2rad($centreY);
     
    my $rayonRad = $rayon/6378137; # TODO: deg2rad pas mieux ?
    my ($pi) = pi;
    #for($i=0; $i<=360; $i++) {
    #	$radial = deg2rad($i);
    #	$lat_rad = asin(sin($lat1)*cos($d_rad) + cos($lat1)*sin($d_rad)*cos($radial));
    #	$dlon_rad = atan2(sin($radial)*sin($d_rad)*cos($lat1), cos($d_rad)-sin($lat1)*sin($lat_rad));
    #	$lon_rad = fmod(($long1+$dlon_rad + M_PI), 2*M_PI) - M_PI;
    #	fwrite( $fileappend, rad2deg($lon_rad).",".rad2deg($lat_rad).",0 ");
    #	}
     
    # Calcule les points du cercle:
      for(my $i=0;$i<=360;$i++) {
        next if ($i % $modulo != 0);
        my $radial = deg2rad($i);
        my $latRad = asin(sin($centreY)* cos($rayonRad) + cos($centreY)* sin($rayonRad)* cos($radial));
        my $dLonRad = atan2(sin($radial)* sin($rayonRad)* cos($centreY), cos($rayonRad)-sin($centreY)* sin($latRad));
        #my $lonRad = (($centreX + $dLonRad + $pi) % (2*$pi)) - $pi; # Utilise le reste de la division (Modulo)
        my $lonRad = ($centreX + $dLonRad + pi) % (2*$pi) - pi; # Utilise le reste de la division (Modulo)
        print ($centreX + $dLonRad + pi) % (2*$pi) - $pi;
        my $lonDeg = rad2deg($lonRad);
        print "Longitude = $lonRad rad = $lonDeg deg\n";
        my $latDeg = rad2deg($latRad);
        push @pointsCercle, "$lonDeg,$latDeg";
        #print "$lonDeg,$latDeg\n";
      } # Fin for
     
    @_=@pointsCercle;
    } # Fin de sub

  2. #2
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Tout simplement parce que dans ton calcul de lonrad tu utilises 'pi' alors que quand tu fais un print tu utilises '$pi'...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $lonRad = ($centreX + $dLonRad + pi) % (2*$pi) - pi; 
           print ($centreX + $dLonRad + pi) % (2*$pi) - $pi;
    Et que si je juge d'après le reste de ton code:
    pi renvoie un tableau ?

    2 remarques:
    * Si je ne me trompe pas, en Perl, la fonction pi n'existe pas (donc à moins qu'elle ne soit déclarée dans ton code, il ne se passera rien)

    * Le modulo '%' en Perl travaille sur des nombres entiers, et non sur des nombres à virgule flottante.
    (voir perlop - multiplicative operators )
    Il te vaudrait donc mieux coder une méthode qui fasse l'équivalent du modulo sur des nombres à virgule flottante...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut
    Merci pour ta reponse, MarneusCalgarXP.

    Il s'agit dans ce cas du modulo, à tous les coups. J'utilise le module Math:Trig qui renvoit pi. Et le fait d'utiliser $pi et pi, c'est parce que j'ai fait differents essais, mais ça ne changeait rien...

    Ce que je ne m'explique pas, c'est que ma variable $lonRad ne contient pas ce qu'imprime la formule juste apres....et les deux contiennent le modulo.
    Saurais tu m'orienter vers un code qui calcule le modulo avec les virgules flottantes, que je vois si c'est cela ?

    Merci encore

    Bonne journée

  4. #4
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    c'est tout simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub modulofloat($$)
    {
        my ($value, $modulo) = @_;
        # tant que la valeur est supérieure au modulo, on lui soustrait le modulo
        while ($value > $modulo) {
            $value -= $modulo;
        }
        # tant que la valeur est inférieure à - modulo, on lui ajoute le modulo
        while ($value < - $modulo) {
            $value += $modulo;
        }
        return $value;
    }
    A noter que cette méthode te renvoie une valeur comprise entre -modulo et +modulo.
    Le modulo n'étant pas bien défini pour les nombres négatifs, tu peux avoir besoin d'une autre variante, qui te renvoie une valeur comprise entre 0 et +modulo.
    Dans ce cas, il suffit de remplacer le test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ($value < - $modulo)
    par
    Voila..

  5. #5
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Et après, tu peux l'utiliser de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    use strict;
    use warnings;
    use Math::Trig;
     
    # une valeur qui vaut 2pi + 1/2
    my $a = 2 * pi + 0.5;
    # b contiendra le modulo de $a par pi, soit 1/2
    my $b = &modulofloat($a, pi);
    # on affiche le résultat
    printf("%f modulo %f = %f\n", ($a, pi, $b));

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut Merci bcp ca marche mieux :-)
    Merci MarneusCalgarXP !

    C'est, comme tu le disais, le fait que le modulo de Perl ne renvoit que des entiers qui donnait ce mauvais résultat...
    Ta fonction fait exactement ce que je voulais

    Bonne journée

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

Discussions similaires

  1. Récupérer une variable calculée dans une requête SQL
    Par nanar1 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/01/2009, 11h45
  2. Réponses: 6
    Dernier message: 14/08/2008, 18h39
  3. Réponses: 3
    Dernier message: 16/07/2008, 16h28
  4. calcul entre deux champs dans une table
    Par pomar dans le forum Access
    Réponses: 7
    Dernier message: 29/11/2006, 18h27
  5. Recuperer un champ calculé dans une variable....
    Par vijeo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 21/12/2004, 14h57

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