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 :

[langage] traduction d'un fonction python en perl


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 10
    Points : 8
    Points
    8
    Par défaut [langage] traduction d'un fonction python en perl
    Bonjour a tous,

    j'aurai besoin d'une traduction de langage.
    En gros, j'ai trouvé une fonction qui me permet de calculer la fonction inverse du chi2, mais elle est écrite en python. Est ce que quelqu'un pourrait m'aider à la transformer en perl ?

    Je précise que je débute en perl....


    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
    A Python Implementation of the Inverse Chi-Square Function
     
    import math
     
    def chi2P(chi, df):
        """Return prob(chisq >= chi, with df degrees of
    freedom).
     
        df must be even.
        """
        assert df & 1 == 0
        # XXX If chi is very large, exp(-m) will underflow to 0.
        m = chi / 2.0
        sum = term = math.exp(-m)
        for i in range(1, df//2):
            term *= m / i
            sum += term
        # With small chi and large df, accumulated
        # roundoff error, plus error in
        # the platform exp(), can cause this to spill
        # a few ULP above 1.0. For
        # example, chi2P(100, 300) on my box
        # has sum == 1.0 + 2.0**-52 at this
        # point.  Returning a value even a teensy 
        # bit over 1.0 is no good.
        return min(sum, 1.0)

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ca peut se passer presque directement en Perl :
    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
     
     
    sub chi2P ($$){ 
        #chi2P( $chi, $df )
        #Return prob(chisq >= chi, with df degrees of freedom). 
        #df must be even. 
     
        my $chi = shift; $df = shift;
        # XXX If chi is very large, exp(-m) will underflow to 0. 
        my $m = $chi / 2.0 
        my $sum = exp(-$m); my $term = $sum;
        foreach my $i (1..int($df/2)){ 
            $term *= $m / $i; 
            $sum += $term; 
        # With small chi and large df, accumulated 
        # roundoff error, plus error in 
        # the platform exp(), can cause this to spill 
        # a few ULP above 1.0. For 
        # example, chi2P(100, 300) on my box 
        # has sum == 1.0 + 2.0**-52 at this 
        # point.  Returning a value even a teensy 
        # bit over 1.0 is no good. 
        }
        return ($sum < 1.0 ? $sum: 1.0);
    }
    N'étant pas expert en Python, je ne suis pas totalement sûr du sens de "df//2", je l'ai juste remplacé par int(df/2), mais c'est peut-être une erreur.

    Cependant, si tu veux avoir une meilleure précision et que tu n'as pas besoin d'une vitesse extrème, tu devrais envisager d'utilliser un module comme Math::BigFloat.

    [EDIT] J'ai corrigé quelques oublis de "$".

    --
    Jedaï

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci, je crois que ca va beaucoup m'aidé !

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Voici mon script mais il est a moitier perl a moitier python. J'aime bien me compliquer la vie.

    #!/usr/bin/perl

    print _("Content-type: text/html\n\n");

    `quota | tail -n1` =~ / +(\d+) +(\d+) +(\d+)/;

    used_Ko = sprintf "%d", $1;
    used_Mo = sprintf "%.2f", ($1)/1024;

    total_Ko = sprintf "%.0f", $3;
    total_Mo = sprintf "%d", ($3)/1024;

    remain_Ko = sprintf "%.0f", $total_Ko - $used_Ko;
    remain_Mo = sprintf "%.2f", ($total_Ko - $used_Ko)/1024;

    pc = sprintf "%.2f", ($1/$3)*100;

    print _("&lt;html&gt;&lt;head&gt;&lt;title&gt;Espace disque&lt;/title&gt;&lt;/head&gt;&lt;body
    bgcolor=#D0DCE0&gt;\n");

    quelqu'un arriverai t 'il a m'aider a le traduire

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

Discussions similaires

  1. Equivalence à la fonction chop() en Perl
    Par samjung dans le forum Langage
    Réponses: 9
    Dernier message: 11/04/2006, 15h41
  2. nom de fonction python
    Par deb75 dans le forum Général Python
    Réponses: 4
    Dernier message: 31/03/2006, 21h54
  3. fonction python similaire à find en bash
    Par deb75 dans le forum Général Python
    Réponses: 1
    Dernier message: 21/12/2005, 11h48
  4. Réponses: 3
    Dernier message: 24/12/2004, 17h22
  5. [langage] [traduction] Structure SWITCH
    Par rbh dans le forum Langage
    Réponses: 6
    Dernier message: 07/06/2004, 17h24

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