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 PHP Discussion :

Travailler avec un entier 64 bits et double (64 bits aussi)


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut Travailler avec un entier 64 bits et double (64 bits aussi)
    Bonjour,

    dans un fichier je lis un double (64 bits donc) stocké dans un fichier.
    Le problème, c'est que je viens de me rendre compte que PHP travaille avec des nombre 32 bits sur ma machine (32 bits également).

    Voici mais fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        /*  Read Uin64 */
        function readUInt64()
        {
            $uInt64 = @fread($this->fileId, 8) ;
     
            $this->currentPosFile += 8 ;
     
            return (ord($uInt64[0]) << 56) | (ord($uInt64[1]) << 48) | (ord($uInt32[2]) << 40) | (ord($uInt64[3]) << 32) | (ord($uInt64[4]) << 24) | (ord($uInt64[5]) << 16) | (ord($uInt64[6]) << 8) | ord($uInt64[7]) ;
        }
    me renvoie un nombre 32 bits.

    de plus cette fonction :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    function readDouble()
        {
            // 32 bits
            //$val = 0xBF866666  ; // -1.05
            //$val = 0xC1199999 ; //-9.6
            //$val = 0x3EC00000 ; // 0.375
     
            $val = readUInt64() ;
     
     
            /* 64 bits */
            // S0eeeeeeeeeeMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
            $sizeOfMantisse = 52 ;
            $signMask = 1 << 63 ; //
            $exposantMask = 0x7FF << $sizeOfMantisse ; // eeeeeeeeeee
            $mantisseMask = 0xFFFFFFFFFFFFF ; // MM...MM
            $biais = 1023 ;
     
            /* 32 bits
            $sizeOfMantisse = 23 ;
            $signMask = 1 << 31 ; // 0x80000000
            $exposantMask = 0xFF << $sizeOfMantisse ; // eeeeeeeeee 0x7F800000
            $mantisseMask = 0x7FFFFF ; // MM...MM
            $biais = 127 ;        
            */
     
            /* 80 bits
            $sizeOfMantisse = 64 ;
            $signMask = 1 << 79 ; 
            $exposantMask = 0x7FFF<< $sizeOfMantisse ; // ee...ee
            $mantisseMask = 0xFFFFFFFFFFFFFFFF ; // MM...MM
            $biais = 16383 ;          
            */
     
            $sign = (($val & $signMask) != 0) ;
     
            $exposant = ($val & $exposantMask) >> $sizeOfMantisse ;
     
            $tmpMantisse = $val & $mantisseMask ;
     
            $div = 1 ;
     
            $mantisse = 1 ;
     
            for($i = 0; $i < $sizeOfMantisse; $i++)
            {                      
                $bit = ($tmpMantisse >> ($sizeOfMantisse - $i)) & 1 ;
     
                $mantisse += ((1 / $div) * $bit) ;
     
                $div = $div * 2 ;            
            }       
     
            if (($exposant == 0) && ($mantisse == 0))
            {
                $number = 0.0 / 1.0 ;
            }
            else
            {             
                $number = pow(2, $exposant - $biais) * $mantisse ;
     
                if ($sign)
                {
                    $number = -1 * $number ;
                }
            }
     
            return $number ;
        }
    va me renvoyer un float (32 bits) et non un double.

    Comment faire ?

    Merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Regarde ces 2 liens :
    http://www.php.net/manual/fr/book.bc.php
    http://www.php.net/manual/fr/book.gmp.php
    Tu trouveras peut-être ton bonheur.

  3. #3
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Merci, c'est GMP qui va me falloir, par contre il faut charger l'extension.

    Par contre un nombre avec virgule ne fonctionne pas.

    De plus, si je veux décaler de 56 bit, il faut bien que je multiplie le nombre par 0x100000000000000 (56 bits à 0 et le bit de poids fort à 1), non ?

Discussions similaires

  1. Travailler avec des entiers seulement
    Par sivaller dans le forum OpenGL
    Réponses: 4
    Dernier message: 29/03/2008, 18h56
  2. Réponses: 2
    Dernier message: 14/03/2008, 09h57
  3. Comment travailler avec des bits ?
    Par supergrey dans le forum C++
    Réponses: 14
    Dernier message: 27/02/2008, 16h58
  4. Documentation sur la manière de travailler avec le XML en java
    Par DelPiero62 dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 26/03/2003, 09h16
  5. Travailler avec des bits
    Par Vulvulune dans le forum Langage
    Réponses: 5
    Dernier message: 02/03/2003, 19h09

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