unterschiedliches Serververhalten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • unterschiedliches Serververhalten

    Hallo,
    ich hab ein Script auf zwei verschiedenen Servern laufen und ich blick es nicht mehr.

    Hier mal die Ausgangslage:

    a = 4653896912
    b = 13

    nach
    PHP-Code:
    $a = ($a>>$b); 
    kommt auf einen Server:

    a = 568102

    und auf dem anderen

    a = 43814 ->(so soll es sein !)

    raus.

    Was soll mir das jetzt sagen ? Ich hab jeweils Debug ausgaben vor dieser und nach der Anweisung gemacht und er rechnet einfach anders. An welchen Einstellungen kann den sowas liegen.

    Was macht $a>>$b ?

    Ist doch ne Bitverschiebung ?

    Gruß Thomas
    Spambot Falle
    Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

  • #2
    die zahl 4653896912 (ca. 4,6 mrd.) ist größer als 2^32 (ca. 4,2 mrd.) und passt noch nicht mal in ein 32-bit integer.

    sie entspricht der binären zahl 100010101011001001101010011010000.

    $a >> $b shiftet die zahl um 13 stellen nach rechts (d.h. teilt sie durch 2^13).

    das ergibt 10001010101100100110b = 568102d

    4653896912 / 2^13 = 568102,650390625
    da bitshiften in php nur auf integern funktioniert, entspricht das dem ergebnis 568102.

    warum erwartest du also 43814?

    für solch große werte solltest du die bc* funktionen verwenden.

    Kommentar


    • #3
      Binärer Operator: "schiebe nach rechts"

      /edit/
      Huch, nach dem verschmelzen, ist meine Antwort diesem neuen Kontext ist nicht mehr sinnvoll..
      Also bitte ignorieren..!
      Zuletzt geändert von combie; 11.01.2007, 18:07.
      Wir werden alle sterben

      Kommentar


      • #4
        Original geschrieben von penizillin
        warum erwartest du also 43814?

        für solch große werte solltest du die bc* funktionen verwenden. [/B]
        Also auf dem Server wo das Script richtig funktioniert kommt an der Stelle 43814 raus.

        Auf dem anderen Server leider 568102 auch wenn das richtig ist.

        hier mal die Funktion die ich auch nur aus dem Netz hab:

        PHP-Code:
        //unsigned shift right
        //unsigned shift right
        function zeroFill($a$b)
        {
        echo 
        "<hr>";
        echo 
        "a in zerofill" $a "<hr>";
        echo 
        "b in zerofill" $b "<hr>";


            
        $z hexdec(80000000);
                if (
        $z $a)
                {
        echo 
        "zerofill - z und a  " $a "<hr>";
                    
        $a = ($a>>1);
                    
        $a &= (~$z);
                    
        $a |= 0x40000000;
                    
        $a = ($a>>($b-1));
                }
                else
                {
        echo 
        "zerofill - else " $a "<hr>";
                    
        $a = ($a>>$b);
                }
        echo 
        "a nach zerofill " $a "<hr>";
                return 
        $a;

        von hier....
        http://www.pagerank-without-toolbar.com/

        meinst du das es an sowas wie
        bcmath.scale in der php.ini liegen könnte ?

        http://www.dynamicwebpages.de/php/ref.bc.php

        gruß Thomas
        Spambot Falle
        Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

        Kommentar


        • #5
          Hmmm
          habs nochmal so ausprobiert....

          PHP-Code:
          echo 4653896912>>13
          ich krieg wirklich zwei Ergebnisse - gibt es doch garnicht -

          43814 und 568102
          muss doch an irgendeiner Config liegen ?
          Spambot Falle
          Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

          Kommentar


          • #6
            PHP-Code:
            error_reporting(E_ALL);
            $a 4653896912;
            $b 13;
            echo (int)(
            $a/pow(2,$b)); // liefert bei mir 568102
            echo '<br>';
            echo (int)(((int)
            $a)/pow(2,$b)); // liefert bei mir 43814
            echo '<br>';
            echo 
            $a>>$b// liefert bei mir 43814
            echo '<br>';
            echo 
            bcdiv($a,bcpow(2,$b)); // liefert bei mir 568102
            echo '<br>';
            echo 
            bcdiv(bcmod($a,0xffffffff),bcpow(2,$b)); // liefert bei mir 43814 
            Ebend das typische Überlaufverhalten...
            Ist das eine evtl ein 64 Bit System???

            PHP-Code:
            echo ($a 0xffffffff)>>$b
            Sollte dich retten!!!
            Zuletzt geändert von combie; 11.01.2007, 18:37.
            Wir werden alle sterben

            Kommentar


            • #7
              die entscheidende Frage ist, was macht es bei Überlauf im Normalfall wenn du das heraus gefunden hast, dann müsste dir einiges klar sein.

              Kommentar


              • #8
                haha super !!!

                ich bau jetzt einfach

                bcdiv(bcmod($a,0xffffffff),bcpow(2,$b));

                hier ein. Danke !

                übrigens kommt bei mir

                1:568102
                2:568102
                3:568102
                4:568102
                5:43814

                auf dem Server raus auf dem es nicht funktioniert hat und bei dem anderen das was du hast.

                Ich hab es zwar nicht kapiert.....aber wenn's funzt

                Danke nochmal
                Spambot Falle
                Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

                Kommentar


                • #9
                  Du hast da wohl ein 64 Bit System!!!
                  Nimm diese:
                  PHP-Code:
                  echo ($a 0xffffffff)>>$b
                  erheblich effizienter!!
                  Wir werden alle sterben

                  Kommentar


                  • #10
                    hallo,
                    jetzt muss mir jemand doch noch helfen.

                    echo ($a & 0xffffffff)>>$b;

                    was macht das jetzt genau

                    schiebt in $a das höchste was geht ?


                    wie erzeuge ich jetzt einen überfluß bei sowas hier

                    $a<<10

                    also genau andersrum ?

                    irgendwie ist mir das zu hoch.....

                    PHP-Code:

                    // 64 bit Version
                    function zeroFill($a$b)
                    {
                        
                    $z hexdec(80000000);
                            if (
                    $z $a)
                            {
                                
                    $a = (($a 0xffffffff)>>1);
                                
                    $a &= (~$z);
                                
                    $a |= 0x40000000;
                                
                    $a = (($a 0xffffffff)>>($b-1));
                            }
                            else
                            {
                                
                    $a = ($a 0xffffffff)>>$b;
                            }
                            return 
                    $a;

                    früher war es so

                    PHP-Code:
                    function zeroFill($a$b)
                    {
                        
                    $z hexdec(80000000);
                            if (
                    $z $a)
                            {
                                
                    $a = ($a>>1);
                                
                    $a &= (~$z);
                                
                    $a |= 0x40000000;
                                
                    $a = ($a>>($b-1));
                            }
                            else
                            {
                                
                    $a = ($a>>$b);
                            }
                            return 
                    $a;

                    aber da ist noch eine ander function die ich auch umstellen muss
                    PHP-Code:
                    function mix($a,$b,$c) {
                      
                    $a -= $b$a -= $c$a ^= (zeroFill($c,13));
                      
                    $b -= $c$b -= $a$b ^= ($a<<8);
                      
                    $c -= $a$c -= $b$c ^= (zeroFill($b,13));
                      
                    $a -= $b$a -= $c$a ^= (zeroFill($c,12));
                      
                    $b -= $c$b -= $a$b ^= ($a<<16);
                      
                    $c -= $a$c -= $b$c ^= (zeroFill($b,5));
                      
                    $a -= $b$a -= $c$a ^= (zeroFill($c,3));
                      
                    $b -= $c$b -= $a$b ^= ($a<<10);
                      
                    $c -= $a$c -= $b$c ^= (zeroFill($b,15));

                      return array(
                    $a,$b,$c);

                    Vielleicht kann ja einer mal drüberschauen und mir da helfen....
                    Spambot Falle
                    Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

                    Kommentar


                    • #11
                      Stop :

                      hab was gefunden:

                      http://www.mobileread.com/forums/arc...-1670-p-2.html
                      da wird genau über mein Problem berichtet
                      Spambot Falle
                      Wem das Wasser bis zum Hals steht, sollte nicht den Kopf hängen lassen.

                      Kommentar

                      Lädt...
                      X