Thread RDW 2007/8 -- Aprilscherz (29 answers)
Opened by Ishka at 2007-04-01 15:41

docsnyder
 2007-04-03 10:39
#75607 #75607
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@GoodFella

Quote
Achja und $n%2 funktioniert auch nicht im Allgemeinen, wie mein Beispiel gezeigt hat. Nach der Methode ist die Zahl 19229024324098347987343 nämlich fälschlicherweise gerade.

Das liegt schlicht und ergreifend daran, daß die gewählte Zahl den Wertebereich einer Integer-Variablen auf Deiner Maschine übersteigt.

Code: (dl )
1
2
3
$n = 19229024324098347987343;

print $n;

ergibt

Code: (dl )
1.92290243240983e+22

d.h. die letzten (=niederwertigsten) Stellen können nicht mehr dargestellt werden und sind daher Null. (Der Genauigkeitsbereich von Zahlen bei deren Darstellung in Rechnern ist eben endlich)

Daß Dein Beispiel mit AND das richtige Ergebnis liefert ist Zufall, denn Du wertest das niederwertigste Bit der darstellbaren Bits aus, nicht das niederwertigste Bit der Zahl an sich. Wenn Du's nicht glaubst, dann versuche das mal mit

Code: (dl )
$n = 1922902432409834798734330;

Die &-Methode meint nämlich, die Zahl sei ungerade.

Quote
Wie wäre es mit abs($n)&1 ? Benchmarktechnisch ist das minimal schneller als $n%2.

Wie gesagt, i.a. kannst Du das (aus den genannten Gründen) nicht auf Bit-Ebene machen. Aber irgendwie scheinst Du Dich der Begründung zu verschliessen, denn daraus geht klar hevor, warum man das nicht so machen kann.

Gruss, Doc

P.S. Wie gesagt, in der Regel klappt's ja mit "&", aber es ist eben nicht portabel, "%" hingegen schon.\n\n

<!--EDIT|docsnyder|1175587456-->

View full thread RDW 2007/8 -- Aprilscherz