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 :

racine de 2, précision de 1000 décimale


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 5
    Par défaut racine de 2, précision de 1000 décimale
    bonjour,

    Je me permets de vous solliciter , étant débutant en Perl , mon tuteur me donne des petit travaux à faire mais la je sèche, merci de votre aide , voici l'énoncé :

    On nous demande de calculer les 1000 premières décimales de sqrt(2)
    en utilisant l'algorithme le plus simple et certe le plus couteux en temps de calcul
    par approximation successive en recherchant les nombre à 10^x près encadrant 10^x * sqrt(2), exemple :

    1 < R(2)< 2
    14 < R(200) < 15
    141 < R(20000) < 142
    1414 < R(2000000) < 1415
    etc...

    On va donc rechercher successivement les nombres entiers
    qui encadre 2*10^N
    On travaillera non pas sur ces nombres mais sur les chaines de caracteres qui représentent ces nombres.

    Le langage de script conseillé est "perl" sous Linux pour plusieurs raisons :
    - Perl permet de gerer les chaines sans se soucier de leur longueur, de leur allocation mémoire ou ré-allocation mémoire.
    - Linux possède un utilitaire bc qui permet d'effectuer des opération sur des nombres entier arbitrairement long.
    - Perl permet de recupérer le resultat de bc dans une chaine car bc donne sont résultat à stdout !
    Ce qui n'est pas possible "simplement" en C.

    On écrit en francais notre algorithme :

    R representera la valeur courante de la racine :
    on pose R=1
    "Tant que" le nombre de chiffre de R < 1001
    DEBUT BOUCLE
    On mémorise R dans M : M = R
    On Calcule le carré de R dans R2 : R2 = R * R
    On incrémente la valeur de R : R = R + 1
    ON BOUCLE tant que la chaine representant R2 est inférieure à "2"

    on sait maintenant que les chiffres de M sont BONS pour representer notre resultat.
    on va donc chercher le chiffre suivant
    on multiplie donc M par 10 et on stocke dans R pour le tour suivant
    R = M + "0" (en tant que chaine : on concatène "0 à M)
    Fin "Tant que"

    Arrivé ici R fait 1001 chiffres et la derniere est un 0 qu'on ne doit pas prendre en compte,
    Mais on est sur d'avoir une valeur "par défaut" de sqrt(2)*10^x

    Implémentation :

    Je vois que mon algo me demande :
    - de calculer le carré d'un nombre représenté en chaine de caractères
    - d'incrémenter un nombre du meme genre de 1
    - de faire des comparaisons de chaine

    Je vais tester si bc fonctionne bien :

    echo "19999999999999999+1" | bc
    20000000000000000
    Cool il sait faire des additions

    echo "1234567912345679*999" | bc
    1233333344433333321
    Cool il sait multiplier

    on test dans un script perl
    $R="1414213562";
    $R2=`echo "$R*$R" | bc`;
    print $R2;
    Affiche 1999999998944727844

    Cool je sais utiliser bc dans perl !

    Je sais aussi que je dois faire des "chomp" sur les chaines pour les "nettoyer" avant de les envoyer à bc
    Je cherche comment ecrire proprement un bloc if (...) { ... } en perl, une boucle do { ... } while (...);
    Je cherche comment faire une comparaison de chaines en perl.
    Je cherche comment calculer la longueur d'une chaine en perl.

    Voilà ce que j'ai fais mais visiblement c'est pas bon :

    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
    #!/usr/bin/perl
     
    $R = 1;				#on pose R=1
    Do 				#"Tant que" le nombre de chiffre de R < 1001
    {
    Do 				#DEBUT BOUCLE
    {
    $chomp($R);
    $M=$R; 				#On mémorise R dans M
    $R2=`echo "$R*$R" | bc`;	#On Calcule le carré de R dans R2 
    $R = $R+1;			#On incrémente la valeur de R
    }
    while ($R2 < 2);		#ON BOUCLE tant que la chaine representant R2 est inférieure à "2" 
     
    $M = $M*10;			#on multiplie donc M par 10 
    $R = $M+0;			#on stocke dans R pour le tour suivant
    print $R;
    } 
    while ($R < 1001);		#Fin "Tant que"

  2. #2
    Membre éclairé Avatar de Tiger-222
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Par défaut
    Avant toute chose, pense à mettre ton code entre les balises CODE.
    Ensuite, lorsque tu écrits en PERL, utilise toujours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;
    Afin que tu puisses voir où sont tes erreurs.

    Citation Envoyé par foofoo45 Voir le message
    Je sais aussi que je dois faire des "chomp" sur les chaines pour les "nettoyer" avant de les envoyer à bc
    Cela aurait pu être le cas si les chaînes contiennent un caractère de fin de ligne (\n), mais ici c'est inutile. Voir la doc officielle.

    Citation Envoyé par foofoo45 Voir le message
    Je cherche comment ecrire proprement un bloc if (...) { ... } en perl, une boucle do { ... } while (...);
    Un petit tour par ici ne te fera pas de mal

    Citation Envoyé par foofoo45 Voir le message
    Je cherche comment calculer la longueur d'une chaine en perl.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $longueur = length $chaine;
    Voir la doc officielle.

    En bonus ton code un peu mieu présenté :
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    $R = 1; #on pose R=1
    do { #"Tant que" le nombre de chiffre de R < 1001
    	do { #DEBUT BOUCLE
    		chomp($R);
    		$M=$R; #On mémorise R dans M
    		$R2=`echo "$R*$R" | bc`; #On Calcule le carré de R dans R2
    		$R = $R+1; #On incrémente la valeur de R
    	} while ($R2 < 2); #ON BOUCLE tant que la chaine representant R2 est inférieure à "2"
    	$M = $M*10; #on multiplie donc M par 10
    	$R = $M+0; #on stocke dans R pour le tour suivant
    	print $R;
    } while ($R < 1001); #Fin "Tant que"
    Par contre je n'ai pas regardé si ton code colle à l'algo, va falloir bosser un peu

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 5
    Par défaut
    Merci Tiger222 d'y avoir jeter un coup d'oeil malgré que mon sujet soit un peu long.... Sinon oui tkt pas je bosse je bosse je vais vais bien regarder les liens que tu m'a envoyé et essayer d'ameliorer tt ça !

    Mais si tu veut bien jeter un œil a mon code voir si ça a l air a peu près correct stp ça serai sympa ?

    Meci

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    En fait, je viens de voir qu'il était possible d'intégrer du code bc directement en perl en utilisant Inline::BC

Discussions similaires

  1. scipy.poly1d : précision du calcul des racines
    Par ryced dans le forum Calcul scientifique
    Réponses: 5
    Dernier message: 25/01/2010, 10h04
  2. [XL-2003] VBA - Calculer avec précision décimale
    Par Lorenzole+bo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/01/2010, 16h16
  3. Nombres décimaux, arrondissement avec précision décimale.
    Par Oscar Hiboux dans le forum Contribuez
    Réponses: 3
    Dernier message: 14/09/2009, 04h52
  4. précision du champs décimal
    Par gerald57 dans le forum Access
    Réponses: 5
    Dernier message: 15/05/2008, 15h56
  5. précision décimale dans un tableau
    Par craryb dans le forum C++
    Réponses: 3
    Dernier message: 24/08/2007, 16h34

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