Schrift
[thread]6377[/thread]

Problem mit PHP und Perl (berechnung)



<< >> 4 Einträge, 1 Seite
thePerlHelper
 2004-07-05 13:59
#83873 #83873
User since
2004-07-05
2 Artikel
BenutzerIn
[default_avatar]
Warum ist da das Ergebnis unterschiedlich?

PHP-Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$d = "4653896912";
$b = "13";
$z = hexdec(80000000);
print "1: $z\n";
if($z & $d){
$d = ($d>>1);
$d &= (~$z);
$d |= 0x40000000;
$d = ($d>>($b-1));
}else{
$d = ($d>>$b);
}
print "2: $d\n";
?>


Perl-Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

$d = "4653896912";
$b = "13";
$z = hex(80000000);
print "1: $z\n";
if($z & $d){
$d = ($d>>1);
$d &= (~$z);
$d |= 0x40000000;
$d = ($d>>($b-1));
}else{
$d = ($d>>$b);
}
print "2: $d\n";
exit;


Ergebnis:
bei PHP: 1: 2147483648 2: 262143 (korrekt)
bei Perl: 1: 2147483648 2: 524287 (falsch)

Ich hoffe jemand sieht den Fehler oder hat eine Idee woran es liegt.

Laut "Programmieren mit PHP" und "Programmieren mit Perl" sollte der Quellcode haargenau dasselbe machen. :(
Beachtet das & und && ein unterschied ist !!
Relais
 2004-07-05 14:26
#83874 #83874
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was soll denn das werden? Eine Übung für obfuscated Programming?

Wenn ich ein paar print-statements hinzufüge,
und den Teil des Codes weglasse, der nix tut,
bekomme ich

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
$d = "4653896912";
$b = "13";

print "1: ",hex(80000000),"\n";

# ehemals im if-block
print "2: $d vor erstem right shift (p.95 camel book)\n";
$d = ($d>>1);
print "2: $d nach erstem und vor zweitem right shift (p.95 camel book)\n";
$d = ($d>>($b-1));
# /ehemals im if-block

print "2: $d\n";


Tja, da das ganze für mich kein wiedererkennbares Muster aus irgeneiner Vorlesung ergibt, finde ich noch auf eben der Seite 95 dies erwähnenswert:

Quote
Be careful, though. Results on large (or negative) numbers may vary depending on the number of bits your machine uses to represent integers.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
thePerlHelper
 2004-07-05 18:01
#83875 #83875
User since
2004-07-05
2 Artikel
BenutzerIn
[default_avatar]
Quote
Was soll denn das werden? Eine Übung für obfuscated Programming?

Eine Übung wäre auch mal nett aber bei einer Übung könnte ich die Lösung nachschauen wenn es aus einem Buch oder Vorlesung wäre. Leider ist es Quellcode der programmiert wurde. Es ist auch unwichtig ob der Quellcode im moment sinnvoll oder sinnlos ist, nur das Ergebnis muss mit dem von PHP übereinstimmen.

Darum sollte wohl meine Frage eher heissen wie erhalte ich bei Perl5 das gleiche Ergebnis wie im oben gezeigten PHP-Code ?

Wahrscheinlich würde sich das Problem mit Perl6 in luft auflösen http://dev.perl.org/perl6/rfc/279.html aber das hilft bei Perl5 nicht weiter.

Mit einem einfachen printf("%x\n", $d); stellt man fest das 0xFFFFFFFF angegeben wird, statt 0x11564D4D0. Also nur 32bit, also wäre die zweite Frage wie könnte man dies umgehen?
ptk
 2004-07-05 21:22
#83876 #83876
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich habe keine Loesung, aber ein paar Hinweise: Mit "use bigint" oder "use bignum" kann man beliebige Genauigkeiten erreichen (trotzdem komme ich nicht auf das gleiche Ergebnis). Man kann Perl auch mit 64bit-Support kompilieren, falls es fuer dein Vorhaben praktikabel ist.
<< >> 4 Einträge, 1 Seite



View all threads created 2004-07-05 13:59.