AGB  ·  Datenschutz  ·  Impressum  







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

runden von 0.0099999997765

Ein Thema von stoxx · begonnen am 7. Jun 2006 · letzter Beitrag vom 9. Jul 2006
Antwort Antwort
Seite 2 von 3     12 3      
rory
(Gast)

n/a Beiträge
 
#11

Re: runden von 0.0099999997765

  Alt 24. Jun 2006, 16:58
Kurze Antwort, hochgradig inkompetent:

Die >2 Nachkommastellen lasse ich von Excel *mit Excel* runden.

Alles Andere führt zu Reklamationen bei den Kunden.

mfg
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#12

Re: runden von 0.0099999997765

  Alt 24. Jun 2006, 22:11
Zitat:
Hallo Stoxx,
ich hab mir mal ein paar Gedanken dazu gemacht, und das Resultat ist weiter unten.
... ach Du grüne Neune ... bist Du wahnsinnig ?

Du solltest doch keine Diplomarbeit draus machen
Was soll ich da sagen, vielen Dank !!!
Aber warum soll meine Funktion nicht mit negativen Zahlen arbeiten ? hab ich was übersehen, funktioniert doch ?!
Dummweise reichen meine ASM Kenntnisse nicht aus, und ich kann die Funktion nur blind übernehmen. Testen ist da so eine Sache.
Vielen Dank !
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#13

Re: runden von 0.0099999997765

  Alt 24. Jun 2006, 22:29
Zitat von rory:
Kurze Antwort, hochgradig inkompetent:

Die >2 Nachkommastellen lasse ich von Excel *mit Excel* runden.

Alles Andere führt zu Reklamationen bei den Kunden.

mfg
@Rory
Das Schlimme an manchen Menschen ist, daß sie so viele Dinge wissen, die so nicht sind.
Vielleicht solltest Du Dir den ganzen Thread mal richtig durchlesen. Eventuell verstehst Du dann, warum Stoxx seine Rundungsfunktion geschrieben hat - und warum ich das Ganze etwas schneller gemacht habe.

Mal nebenbei : Mit welchem Zahlenformat willst Du denn eine Rundung, wie Stoxx sie benötigt, erreichen ?
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
bit4bit

Registriert seit: 14. Jun 2006
Ort: Köln
25 Beiträge
 
#14

Re: runden von 0.0099999997765

  Alt 25. Jun 2006, 15:37
Hallo allerseits,

@Amateurprofi

Du zitierst stoxx mit "Um nach einem Hin und Herwandeln ..."
Ich kann das nirgendwo in diesem Thread finden, wo hast Du das her ?

@stoxx

Frage zu Deiner Broker API:
Erhältst Du zu jedem Kurswert immer auch die minimale Schrittweite oder kannst Du die sonstwie zuverlässig bestimmen bevor Du mit den Kurswerten irgendwelche Berechnungen durchführst?
Sind die Anzahl der Nachkommastellen bei allen Werten unbekannt, oder nur die der minimalen Schrittweiten?
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#15

Re: runden von 0.0099999997765

  Alt 25. Jun 2006, 15:55
Hallo Bit4bit, das hin und herwandeln bezog sich auf diesen Thread: (sind übrigens zwei ganz verschiedenen Anwendungsfälle)

http://www.delphipraxis.net/internal...077&highlight=

Zitat:
Frage zu Deiner Broker API:
Erhältst Du zu jedem Kurswert immer auch die minimale Schrittweite oder kannst Du die sonstwie zuverlässig bestimmen bevor Du mit den Kurswerten irgendwelche Berechnungen durchführst?
Sind die Anzahl der Nachkommastellen bei allen Werten unbekannt, oder nur die der minimalen Schrittweiten?
man bekommt die minimale Schrittweite. z.B. 0,5 Schritte. Dieser Wert wird als Single übermittelt.
0,4999999878 steht dann drin.
Aus der größe Zahl könnte man sicherlich bestimmen, dass eine Nachkommastelle sinnvoll wäre.
Ich brauche aber genau die 0,5 um zum beispiel einen Wert von 5300,398978 auf 5300,5 runden zu können. Und eben nicht auf 5300,4 (was mit dem Wissen möglich gewesen wäre, dass man auf eine Nachkommastelle runden möchte)
Wenn man dann einen Trade an die Börse schickt wird die Order mit einem Preis von 5300,4 abgewiesen- kein gültiger Preis.
Somit brauchte ich eine Funktion, die mir aus 0,4999987 -> 0,5 herstellt.
(wenn man mit 0,49999 anfängt zu runden ergibt das ganz unschöne Zahlen

falls noch weiteres Interesse an der besagten API besteht

http://www.interactivebrokers.de
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#16

Re: runden von 0.0099999997765

  Alt 25. Jun 2006, 15:57
gelöscht
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
bit4bit

Registriert seit: 14. Jun 2006
Ort: Köln
25 Beiträge
 
#17

Re: runden von 0.0099999997765

  Alt 25. Jun 2006, 17:16
Hi stoxx , hab noch zwei Fragen:

Ist die Anzahl der Nachkommastellen für jeden Kurswert bekannt? (Ich vermute mal : Ja)

Welche Werte können denn überhaupt bei den minimalen Schrittweiten vorkommen, gibt es dort
vielleicht eine Bildungsregel?

Welche API benutzt Du denn, hab nix für Delphi gefunden ?
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#18

Re: runden von 0.0099999997765

  Alt 25. Jun 2006, 17:39
Hi Bit, was hast Du denn vor, dass Du so genau fragst ?

Zitat:
> Ist die Anzahl der Nachkommastellen für jeden Kurswert bekannt? (Ich vermute mal : Ja)
nein, keine Nachkommastellen, die minimalen Preismovements. Bei einer normalen Aktie wäre das z.b. 0,01 (wie auch die Preise im Supermarkt
Zitat:
> Welche Werte können denn überhaupt bei den minimalen Schrittweiten vorkommen?
es gibt minimale Preismovements von z.B. 1, aber auch 0,25 oder 0,5 oder 0,000001 oder andere

Zitat:
Welche API benutzt Du denn, hab nix für Delphi gefunden ?
ich benutze nun zufällig einen den Quelltext von jemanden, der sich die Arbeit gemacht hat, die mitgelieferten Sourcen der API in C++ nach Delphi zu portieren.
Üblicherweise würde man aber die völlig gleichwertige ActiveX Schnittstelle benutzen.
Hast Du schonmal mit ActiveX gearbeitet ? Die API musst Du einfach als Typbibliothek importieren und danach steht Dir die API im Objectinspektor zur Verfügung.

vlg stoxx
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
bit4bit

Registriert seit: 14. Jun 2006
Ort: Köln
25 Beiträge
 
#19

Re: runden von 0.0099999997765

  Alt 26. Jun 2006, 04:18
Hi stoxx, ich hab nix vor, finde Dein Problem aber interessant!

Wenn man im Dezimalsystem abrunden will, teilt man einfach durch die entsprechende Zehnerpotenz und entfernt alle Nachkommastellen.

Wenn man aufrunden will, addiert man vorher einen Wert von 9/10 der Zehnerpotenz.

Das kaufmännische Runden unterscheidet sich hier nur dadurch, dass vor der Division nicht 9/10 sondern die Hälfte der Zehnerpotenz addiert wird.

Möchte man für die Rundung jetzt Schrittweiten (S) wie 0,25 oder 0,5 verwenden, so formt man die zu rundende Zahl vor der Rundung durch eine Division durch S um, so dass wieder mit Schrittweiten von 10 gearbeitet werden kann. Dann rundet man wie oben beschrieben (Aufrunden, Abrunden oder kaufmännisch runden) und macht die Umformung durch die Multiplikation mit S wieder rückgängig.

Kommen Werte aus der API, so können sie mit dieser Methode erst einmal "in Form" gebracht werden. Dabei ist es natürlich notwendig, dass die minimale Schrittweite bekannt ist.

Für die Übergabe an die API müssen die Werte dann eventuell wieder durch 1.000.000 geteilt werden.


Jetzt endlich zu Deinem ursprünglichen Problem:

Ich denke mal, dass Du als minimale Schrittweite jeweils eine Zahl übergeben bekommst, die eigentlich nicht kleiner sein kann als 0,000001 und wohl nicht mehr als 4 signifikante Ziffern enthält, oder ?
Die Darstellungsgenauigkeit einer Single müsste also eigentlich vollkommen ausreichend sein um diese Zahl darstellen zu können.

Wenn eine solche Zahl in ihrer dezimalen Darstellung eine Reihe von Neunen enthält heißt das, dass die interne (binäre Darstellung) knapp unterhalb des tatsächlichen (korrekten) Wertes liegt.

Entscheidend für die Korrektur dieser Zahl auf einen "vernünftigen" Wert ist folgende Überlegung:

Die Stellen vor dem Komma benötigen zu ihrer binären Darstellung eine bestimmte Anzahl von Bits. Zahlen zwischen 64 und 127 belegen zum Beispiel alle 7 Bits, die Zahlen zwischen 128 und 255 benötigen 8 Bits usw. Diese Bits gehen für die Darstellung des Dezimalbruches verloren.

Da eine Single Floating Point Variable in Delphi für die interne Darstellung der Mantisse 23 Bit benutzt, kann man sich die Anzahl der für den Binärbruch verfügbaren Bits jeweils ausrechnen.

Nur Zahlen die kleiner als 8 sind können hier noch mit 6 Nachkommastellen dargestellt werden.
Für 4 Nachkommastellen muss die Zahl kleiner als 512 sein. Zahlen kleiner als 65536 erlauben noch 2 Nachkommastellen.

Man kann jetzt in Abhängigkeit der Größe einer Zahl entscheiden ob auf 2, 4 oder 6 Nachkomma-stellen aufgerundet werden muss. Dafür sind nur wenige Vergleiche notwendig.

Alle anderen Werte, die Du durch die API übergeben bekommst, dürften dann also Kurswerte oder so was darstellen. Hier kennst Du ja die minimale Schrittweite und kannst die Werte wie oben beschrieben anpassen.

Hab das ganze mal mit einigen Beispielen versehen und noch ausführlicher beschrieben als Anhang beigefügt.
Angehängte Dateien
Dateityp: pdf 060626_stoxx_135.pdf (44,4 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#20

Re: runden von 0.0099999997765

  Alt 4. Jul 2006, 19:18
Hallo bit4bit,

ich habe Deinen Beitrag erst jetzt irgendwie gelesen, Du hast Dir viele Gedanken darum gemacht.

Zitat:
Man kann jetzt in Abhängigkeit der Größe einer Zahl entscheiden ob auf 2, 4 oder 6 Nachkomma-stellen aufgerundet werden muss. Dafür sind nur wenige Vergleiche notwendig
so ähnlich gehe ich ja bei codieren meiner Zahlen vor. Du darfst das Problem des Rundens nicht vermischen mit dem Problem der Speicherung der Zahlen.

Wenn Du Dir den folgenden Beitrag anschaust:

http://www.delphipraxis.net/internal...077&highlight=

die Zahlen werden in 32 Bit in "meinem" speziellen Format abgespeichert ( in einem Integer) , bieten aber dennoch mehr Anzahl signifikanter Stellen, als ein Single Wert, weil ich für die Kodierung des "Exponenten" nicht 8 Bit wie bei einem Single Wert, sondern nur 2 Bit verwende.

0XX0 0000 0000 0000 0000 0000 0000 0011

in XX ( Bit 29 und Bit 30) werden die Nachkommstellen codiert. 4 Zustände sind mit 2 Bits möglich. ich benutze entweder 2, 4 oder 6 Nachkommastellen. Eine Zahl wie 0,5 * 10^-12 abzuspeichern ist dann natürlich nicht möglich, aber eben auch nicht nötig für meine Zwecke !

Zitat:
Übrigens, die Benutzung von 64 Bit Integer Variablen dürfte für Deine Zwecke wohl das Beste darstellen.
ja eben nicht, da ich Platz sparen muss und ich deswegen die Zahlen auf 32 Bit "komprimiert" habe.

Was natürlich richtig ist, (weiß nicht, ob Du das gemeint hast) .. man könnte die minimale Preisdifferenz, wenn man sie erhält, zum Beispiel 0,249999999 selbst versuchen erstmal auf 0,25 zu runden (Anhand der Größe an sich dieser Zahl). Um dann damit wieder den eigentlichen Preis zu runden.
Für alle Fälle wo ich aber wiederum nur die Zahl an sich kenne ( nicht die 0,25 ) macht sich das Verfahren sehr gut.

warum machst Du das runden so kompliziert und addierst erst noch 9/10 ?
round(wert / 0.25) * 0.25 bringt die mir gewünschten Ergebnisse.

Gruß stoxx
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 23:32 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