Hi,
Weil beim Double aus naheliegenden Gründen der Modulo-Operator nicht implementiert sein _kann_
Solche Gründe liegen mir fern, sprich: was ist in PHP so speziell, das es nicht funktionieren _kann_?
Modulo ist als ganzzahliger Rest definiert. Natürlich kann man auch den Rest einer Division mit gebrochenen Zahlen berechnen, dies ist dann aber nicht mehr Modulo. IMHO sind die Funktionen fmod* unglücklich benannet; fremainder oder so wäre besser gewesen.
Ja, deshalb gibt's das auch noch dazu: remainder(3) ;-)
(Ist aber relativ neu und noch nicht überall eingebaut)
Double speichert zwar sehr große Zahlen, allerdings nicht mit beliebiger Präzision. 100000000000000000000000000 ist in Double noch darstellbar, ist aber von 100000000000000000000000001 nicht unterscheidbar.
Also die Werte von double hättest Du durchaus aber mal nachrechnen lassen können! ;-)
Ich steh gerade auf dem Schlauch?
Ich weiß zwar, was Du meinst, nur ist das Beispiel recht unglücklich gewählt und noch unglücklicher formuliert.
Auf dem x86-32 ist das double normalerweise 2^64 Bit groß. (Übrigens deutlich weniger, als Dein 10^26 ;-). 2^64 ist von 2^64+1 durchaus zu unterscheiden, allerdings ist der eigentliche Wert nicht mehr nachvollziehbar, nur noch die Ungleichheit.
Es gibt natürlich auch Implementationsfehler. So ist hier 1/((2^64)) das gleiche wie 1/((2^64)+1), wer den Fehler produziert weiß ich nicht. (Kann auch ein off-by-one irgendwo sein, da 1/((2^64)+2) klappt) Daneben gibt es auch noch Rundungs- und Umbaufehler und was weiß ich noch alles. Bei großen Zahlen ist es besser stets nur mit Integern zu arbeiten. Für die meisten Sprachen gibt es "Bignum" Bibliotheken - oder wie sie auch heißen mögen - die derartiges zur Verfügung stellen.
so short
Christoph Zurnieden