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 :

[Système] problème de rotation binaire


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut [Système] problème de rotation binaire
    Salut à tous,

    Je fais la rotation binaire à gauche suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $var = -2302452860;
     
    echo $var;
    echo "<br>";
    echo $var<<4; // rotation binaire à gauche?>
    Ce que je ne comprends pas, c'est que sur 2 hardware identiques, l'un sous Debian 3.1 et l'autre sous Centos 4.2, j'obtiens des résultats différents :
    Résultats sur Centos :
    -2302452860
    0

    Résultats sur Debian :
    -2302452860
    1815459904

    Le résultat correct est celui de la debian.
    Et là, je sèche.
    D'avance, merci de m'éclairer pour corriger ce problème.
    Xris

  2. #2
    Membre expérimenté Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Par défaut
    Citation Envoyé par Xris
    Résultats sur Centos :
    -2302452860
    0
    une version 5.2.* ?

    Citation Envoyé par Xris
    Résultats sur Debian :
    -2302452860
    1815459904
    une version antérieure ?

    PHP5.2.* (tout particulièrement 5.2.1) a adressé beaucoup de bugs dû à l'overflow des registres dans les environnements 64 bits. le $var démarre avec un nombre qui ne peut pas être représenté sur 32 bits signés, par conséquent en overflow. toute opération arithmétique ou binaire se verra normalisé pour éviter l'overflow en 64 bits même si PHP5.2.* demeure un produit 32 bits.

    Citation Envoyé par Xris
    Le résultat correct est celui de la debian.
    quel est le besoin exactement ? car "résultat correct" est assez relatif...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $var = -2302452860;
     
    $var1 = bcmod($var,bcpow(2,31,0))<<4; // tronquer à 32 bits
    $var2 = bcmul($var,bcpow(2,4,0),0); //$var<<4 sur 64 bits;
     
    echo "var = ".$var."<br>";
    echo "var<<4 (32bits) = ".$var1."<br>";
    echo "var<<4 (64bits) = ".$var2."<br>";
    pas réellement testé, mais j'utilise bcmath pour tronquer l'overflow initial de $var et donc <<4 peut être fait sans risque de normalisation overflow avec 5.2.* ... ça devrait fonctionner.

    moins certain pour <<4 sur 64 bits dû au bit 31 set (nombre négatif)... c'est une tentative (probalement ratée) pour montrer que "résultat correct" est très relatif.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut
    Bonjour,

    Merci pour cette réponse.
    J'ai effectué différents tests, et le problème est bien lié à l'overflow des grands entiers signés.

    Les tests sous Centos et Debian ont été faits en php 5.1.6, sur une architecture 32 bits.

    J'ai également fait une autre série de tests sous Debian avec une version 5.1.6 et 5.2.1, et j'ai également les mêmes symptomes.

    Mon problème vient du fait que j'utilise des algorythmes de cryptage qui font massivement appel à des fonctions de manipulation de grands entiers, et j'ai une cette désagréable surprise en passant sous Centos ou en 5.2.1.

    Cette piste m'a en tout cas l'air très pertinente (merci), et je vais la creuser.

    D'une manière générale, peut-on parler de "bug php" entre 2 releases ?

  4. #4
    Membre expérimenté Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Par défaut
    Citation Envoyé par Xris
    Les tests sous Centos et Debian ont été faits en php 5.1.6, sur une architecture 32 bits.

    J'ai également fait une autre série de tests sous Debian avec une version 5.1.6 et 5.2.1, et j'ai également les mêmes symptomes.
    donc possiblement dès 5.1.6? merci pour l'information.

    Citation Envoyé par Xris
    Mon problème vient du fait que j'utilise des algorythmes de cryptage qui font massivement appel à des fonctions de manipulation de grands entiers, et j'ai une cette désagréable surprise en passant sous Centos ou en 5.2.1.
    j'aurais dû m'en douter

    Citation Envoyé par Xris
    Cette piste m'a en tout cas l'air très pertinente (merci), et je vais la creuser.
    n'hésite pas à communiquer tes résultats sur ce sujet, ça m'intéresse.

    Citation Envoyé par Xris
    D'une manière générale, peut-on parler de "bug php" entre 2 releases ?
    pour moi c'est la triste réalité de la transition 32bits->64bits, mais je peux être tout à fait dans l'erreur... as-tu tenté un bug report?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut
    Salut,

    effectivement, et pour résumer :
    en 5.1.6 sur Centos : KO
    en 5.1.6 sur Debian : OK
    en 5.2.1 sur Debian : KO
    tous ces tests ont par contre été réalisés sur plateforme 32 bits.

    Un bug report est en cours, je te tiens au courant.
    ++

Discussions similaires

  1. [Système] Problème avec header() ...
    Par tom06440 dans le forum Langage
    Réponses: 15
    Dernier message: 27/10/2005, 21h33
  2. [PHP - MSSQL] Problème d'upload / binaire
    Par noiserie dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 25/07/2005, 18h03
  3. Réponses: 5
    Dernier message: 19/04/2005, 08h50
  4. [OpenGL] problème de rotation 3D
    Par ReiVon dans le forum OpenGL
    Réponses: 3
    Dernier message: 11/04/2005, 09h47
  5. Problème de rotation
    Par Francky033 dans le forum DirectX
    Réponses: 1
    Dernier message: 17/07/2003, 16h38

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