Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Befehle zum Runden versagen...? (https://www.delphipraxis.net/23466-befehle-zum-runden-versagen.html)

Patrick 3. Jun 2004 16:38


Befehle zum Runden versagen...?
 
Wusstet ihr schon, dass 12345678901234567890.5 gerundet -9,22337203685478E18 ergibt?

Jetzt wisst ihr's...

round(12345678901234567890.5) = -9,22337203685478E18
floor(123456789012.5) = -1097262572
ceil(123456789012.5) = -1097262571

Nur damit ich das verstehe: "round" ist für "real" ausgelegt, das wären etwa 38 Stellen, dies sind nur 20 Stellen...
"floor" und "ceil" sind sogar für "extended" ausgelegt, das sind 4932 Stellen, sie versagen aber schon bei 13 Stellen.

Was sollen die Befehle, wenn sie nichts taugen?
Und wie finde ich von einer Zahl heraus, ob sie nachkommastellen hat?*
*Typ: double oder extended, Länge: etwa 255 Stellen

atreju2oo0 3. Jun 2004 16:43

Re: Befehle zum Runden versagen...?
 
mit trunc kannst Du die Nachkommastellen abschneiden
und wenn Du x=x div 1 verwendest weißt Du ob Nachkommastellen da sind.

Aber warum round nicht funktioniert ist mir echt schleierhaft...
Eventuell hängt das mit dem OS zusammen, weil sizeOF(Integer) vom OS abhängt... :gruebel:

Patrick 3. Jun 2004 16:53

Re: Befehle zum Runden versagen...?
 
Jetzt wo du's sagst, kann es sein, dass die drei Funktionen einen Integer-Rückgabewert haben?
Wenn dem so ist, würde ich es verstehen, da Integer nur max. 9 Stellen zulässt...

Ich brauche auf jeden Fall eine solche Funktion die mir was anderes als Integer, oder Longinteger zurückgibt, also was längeres.

atreju2oo0 3. Jun 2004 17:01

Re: Befehle zum Runden versagen...?
 
Also es gibt spezielle Units die Langzahlarithmetik bereitstellen.
Sowas solltest Du glaube ich bei Torry finden.
Wesentlich spannender ist es sowas selber zu machen.
Du brauchst letztlich nur die schriftliche addition zu implementieren...
Damit lässt sich dann +,-,*,/,x^ undsoweiter aufbauen...

Wenn Du allerdings nicht so lange an dem Thema festhängen willst würde ich einfach bei extended bleiben und im Programm sicherstellen dass es eine N zahl ist.
zum Beispiel mit x:=x div 1;

:-D

Chewie 3. Jun 2004 17:04

Re: Befehle zum Runden versagen...?
 
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 ;)

Chewie 3. Jun 2004 17:11

Re: Befehle zum Runden versagen...?
 
Zitat:

Zitat von Patrick
Nur damit ich das verstehe: "round" ist für "real" ausgelegt, das wären etwa 38 Stellen, dies sind nur 20 Stellen...
"floor" und "ceil" sind sogar für "extended" ausgelegt, das sind 4932 Stellen, sie versagen aber schon bei 13 Stellen.

Alle Delphi-Fließkomma-Funktionen rechnen mit Extended-Werten. Diese verfügen über 19-20 signifikante Stellen, Real-Werte sind nur aus Gründen der Abwaärtskompatibiliät enthalten und entsprechen Double-Werten, die 15-16 sign. Stellen haben. 4932 Stellen kriegst du nur über spezielle Software-Bibliotheken zustande, nicht über hardware-unterstützte Gleitkommaoperationen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz