Einzelnen Beitrag anzeigen

Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Befehle zum Runden versagen...?

  Alt 3. Jun 2004, 17:04
Round gibt einen Wert com Typ Int64 zurück. Das ist ein vorzeichenbehafteter 64Bit-Ganzzahl-Wert, d.h., wenn die Zahl größer wird als High(Int64), wird sie negativ. Die von dir genannte Zahl ist die kleinstmögliche darstellbare Zahl eines Int64, mit anderen Worten, alle 64 Bits der Zahl sind Einsen. Warum Round hier das zurückliefert, versteh ich auch nicht ganz.


Ceil und Floor liefern Integer-Werte, also 32 Bit. Rechnen wir mal nach:
123456789012.5 ist aufgerundet 123456789013. Dies entspricht binär
Code:
1 1100 1011 1110 1001 1001 0001 1010 0001 0101
Da wir nur 32 Bit berücksichtigen, müssen wir die vorderen Bits abschneiden. Also
Code:
1011 1110 1001 1001 0001 1010 0001 0101
Das erste Bit ist eine 1, also ist die Zahl negativ. Nun bilden wir schrittweise das Zweier-Komplement:
Code:
1011 1110 1001 1001 0001 1010 0001 0101 (alle Bits invertieren)
0100 0001 0110 0110 1110 0101 1110 1010 (1 dazuaddieren)
0100 0001 0110 0110 1110 0101 1110 1011
Dezimal ist dies 1097262571, mit Vorzeichen also -1.097.262.571. Und das ist genau das, was Ceil ausgerechnet hat. Also rechnet Ceil richtig.
Mit Floor genau das gleiche, nur das wir mit 123456789012 rechnen müssen.

Nicht die Rundungsfunktionen rechnen falsch, sondern du weißt offensichtlich nicht, dass ein Rechner nicht richtig rechnen kann
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat