AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Befehle zum Runden versagen...?

Ein Thema von Patrick · begonnen am 3. Jun 2004 · letzter Beitrag vom 3. Jun 2004
Antwort Antwort
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#1

Befehle zum Runden versagen...?

  Alt 3. Jun 2004, 16:38
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
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von atreju2oo0
atreju2oo0

Registriert seit: 5. Dez 2003
Ort: Berlin
289 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Befehle zum Runden versagen...?

  Alt 3. Jun 2004, 16:43
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...
Thomas
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Befehle zum Runden versagen...?

  Alt 3. Jun 2004, 16:53
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.
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von atreju2oo0
atreju2oo0

Registriert seit: 5. Dez 2003
Ort: Berlin
289 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Befehle zum Runden versagen...?

  Alt 3. Jun 2004, 17:01
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;

Thomas
  Mit Zitat antworten Zitat
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
Chewie

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

Re: Befehle zum Runden versagen...?

  Alt 3. Jun 2004, 17:11
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 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