Doubles performant ganzzahlig machen
-
Hallo zusammen
ich will zukünftig in meinen Systemen intern nur noch mit ganzen Zahlen arbeiten, d.h. ich muss die "doubles" in "int" konvertieren und das möglichst performant.
D.h. statt eines double lagere ich ein int und ein byte für den Exponenten.
So dass gilt:
Wert = Mantisse * 10^-ExpDerzeit mache ich das ermitteln des Exponenten (und der Mantisse ) so:
static const uint64_t ExpToMulti[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000 }; static const uint8_t MAX_EXPONENT = 10; std::pair<uint64_t,uint8_t> convertDoubleToUint( double value ) { uint8_t expo = 0; while ( expo <= MAX_EXPONENT ) { double with_multiplikator = value * ExpToMulti[ expo ]; double rounded = floor( with_multiplikator + 0.5 ); if ( with_multiplikator == rounded ) return std::make_pair( (uint64_t)rounded, expo ); ++expo; } assert( false ); }
Geht das auch effizienter?
-
Die Frage ist auch, was die Funktion genau liefern soll.
0.7 -> { 7, '0x01' }
0.07 -> { 70, '0x03' }Sollte da ggf. auch { 7, '0x02' } rauskommen?
Kannst du nicht sinnvoll den Exponenten festlegen, anstatt Floating-Point nachzubauen?
PS: Und das assert(false) finde ich auch, sagen wir mal, fragwürdig. Ruf deine Fkt mal mit 0.6999999999 auf..
PS2: Schneller geht bestimmt, allein schon, weil du erstmal mit "mit 1 multiplizieren" anfängst.
-
@It0101 sagte in Doubles performant ganzzahlig machen:
ich will zukünftig in meinen Systemen intern nur noch mit ganzen Zahlen arbeiten
Warum?
-
Hilft da
frexp()
irgendwie?
-
-
Dieser Beitrag wurde gelöscht!
-
@It0101 sagte in Doubles performant ganzzahlig machen:
@hustbaer sagte in Doubles performant ganzzahlig machen:
@It0101 sagte in Doubles performant ganzzahlig machen:
with_multiplikator == rounded
mutig
Ich weiß. Die ganze Sache fühlt sich irgendwie unschön an. Doubles vergleicht man ja aus gutem Grund nicht.
@Swordfish sagte in Doubles performant ganzzahlig machen:
Hilft da
frexp()
irgendwie?Ich probiere mal ob es performanter ist. Danke.
Edit: wobei frexp scheinbar "power of 2" macht und nicht "power of 10" ...
Wenn man im Dezimalsystem die Nachkommastellen entsorgen will ist eine Methode mit power of 10 schon irgendwie notwendig oder habe ich da einen Denkfehler?@SeppJ sagte in Doubles performant ganzzahlig machen:
@It0101 sagte in Doubles performant ganzzahlig machen:
ich will zukünftig in meinen Systemen intern nur noch mit ganzen Zahlen arbeiten
Warum?
Weil ein double zwar die passende Präzision hat, aber nicht den passenden Speicherkonsum.
Sprich: 8 Byte ist mir zu viel.Das Ziel ist, dass ich einen Wert in Mantisse und Exponent darstelle und diesen dann Stop-Bit-Encoded viel günstiger im Speicher darstellen kann.
Der nächste (ganzzahlig gemachte) Wert, der sich nur minimal unterscheided wird dann als Delta dargestellt und bewegt sich dann ganzzahlig meist im Bereich von 1 Byte.Es ist gewissermaßen eine Datenreihe die man auf die Art deutlich günstiger im Speicher darstellen kann.
Mein ZIel ist, so nah wie möglich an die Performance der reinen Doubles ranzukommen.
Beispiel ( nur 4NKS in dem Fall ):
13,4478
13,5100
13,6000
ergibt ( es wird immer der größte Exponent verwendet )
m=134478 e=4
m=135100 e=4
m=136000 e=4134478 3 Byte
622 2 Byte
900 2 Bytemacht 7 Bytes vs. 24 byte als reine Doubles.
-
@It0101 sagte in Doubles performant ganzzahlig machen:
Es ist gewissermaßen eine Datenreihe die man auf die Art deutlich günstiger im Speicher darstellen kann.
Mit welcher Hardware (embedded Controller?) musst Du Dich herumschlagen, damit so etwas noch notwendig ist?
-
@john-0 sagte in Doubles performant ganzzahlig machen:
@It0101 sagte in Doubles performant ganzzahlig machen:
Es ist gewissermaßen eine Datenreihe die man auf die Art deutlich günstiger im Speicher darstellen kann.
Mit welcher Hardware (embedded Controller?) musst Du Dich herumschlagen, damit so etwas noch notwendig ist?
Frage lieber, mit wieviel Daten ich mich rumschlagen muss.... Die Hardware ist sogar relativ neu, aber die Tendenz geht eben zu immer mehr Daten, und da die neue Software dann auch mal ein paar Jahre locker laufen soll, ohne dass man ständig die Hardware neu anschaffen oder ausbauen muss, wollte ich lieber gleich vorsorgen.
Und warum soll man sich nicht auch mal Gedanken machen, ob es bessere Lösungen gibt als die alt hergebrachten. Bin ja schließlich Ingenieur und keine Tipse
Ich finde die Zeiten derzeit ehrlich gesagt bedauernswert wo gedankenlos Hardwareressourcen verballert werden, wo jede mickrige App mit maximal drei Funktionen kaum unter 100Mb zu haben ist... Fürchterlich.
-
@It0101 sagte in Doubles performant ganzzahlig machen:
Bin ja schließlich Ingenieur und keine Tipse
ymmd!
-
@It0101 sagte in Doubles performant ganzzahlig machen:
Frage lieber, mit wieviel Daten ich mich rumschlagen muss....
Also, wie viel Daten sind es?
-
@john-0 sagte in Doubles performant ganzzahlig machen:
@It0101 sagte in Doubles performant ganzzahlig machen:
Frage lieber, mit wieviel Daten ich mich rumschlagen muss....
Also, wie viel Daten sind es?
Zeitreihen zu allen in Deutschland handelbaren Wertpapieren. Sowohl intraday auf Quotebasis als auch trades bis 1998 rückwirkend und auf ohlc-basis.
Oder anders formuliert: es sind genug Daten.Bei den OHLC-Daten ist es das gleiche.
Man kann einfach sagen: ok es sind 4 Doubles ( optional mit vwap und/oder volumen dann eben noch mehr ).
Oder man sagt: es gibt einen Referenzpreis ( z.B. der LOW ) und man speichert die (positiven) Deltas zu H, O, C ganzzahlig.Ich denke daher schon, dass es sich lohnt, zunächst mal mit einer etwas effizienteren Datenhaltung zu experimentieren, anstatt zu sagen: "soll die IT halt mehr RAM reinstecken".
-
@It0101 sagte in Doubles performant ganzzahlig machen:
Zeitreihen zu allen in Deutschland handelbaren Wertpapieren. Sowohl intraday auf Quotebasis als auch trades bis 1998 rückwirkend und auf ohlc-basis.
Die Kurse werden doch sicherlich als Geldbeträge notiert?
-
@john-0 sagte in Doubles performant ganzzahlig machen:
Die Kurse werden doch sicherlich als Geldbeträge notiert?
Ja, vier sogar pro datum.
-
@It0101 sagte in Doubles performant ganzzahlig machen:
@john-0 sagte in Doubles performant ganzzahlig machen:
@It0101 sagte in Doubles performant ganzzahlig machen:
Es ist gewissermaßen eine Datenreihe die man auf die Art deutlich günstiger im Speicher darstellen kann.
Mit welcher Hardware (embedded Controller?) musst Du Dich herumschlagen, damit so etwas noch notwendig ist?
Frage lieber, mit wieviel Daten ich mich rumschlagen muss.... Die Hardware ist sogar relativ neu, aber die Tendenz geht eben zu immer mehr Daten, und da die neue Software dann auch mal ein paar Jahre locker laufen soll, ohne dass man ständig die Hardware neu anschaffen oder ausbauen muss, wollte ich lieber gleich vorsorgen.
Und warum soll man sich nicht auch mal Gedanken machen, ob es bessere Lösungen gibt als die alt hergebrachten. Bin ja schließlich Ingenieur und keine Tipse
Ich finde die Zeiten derzeit ehrlich gesagt bedauernswert wo gedankenlos Hardwareressourcen verballert werden, wo jede mickrige App mit maximal drei Funktionen kaum unter 100Mb zu haben ist... Fürchterlich.
Endlich mal jemand der verstanden hat was Informatiker eigentlich tun sollten wenn sie entwickeln! Coole Sache auf jeden fall
-
@It0101 sagte in Doubles performant ganzzahlig machen:
auf Quotebasis
Also wirklich jeden Tick? (nur interessehalber)
Worauf @john-0 vermutlich hinaus will ist, daß das alles keine
double
s sind sondern micro oder nano-cents.
-
@john-0 sagte in Doubles performant ganzzahlig machen:
@It0101 sagte in Doubles performant ganzzahlig machen:
Zeitreihen zu allen in Deutschland handelbaren Wertpapieren. Sowohl intraday auf Quotebasis als auch trades bis 1998 rückwirkend und auf ohlc-basis.
Die Kurse werden doch sicherlich als Geldbeträge notiert?
Ja. Mit unterschiedlichen "TickSizes", also Nachkommastellen. ( z.B. vielfaches von 5 Cent , oder vielfaches von 1Cent, oder eben auch Hunderstel Cent ).
-
@Swordfish sagte in Doubles performant ganzzahlig machen:
@It0101 sagte in Doubles performant ganzzahlig machen:
auf Quotebasis
Also wirklich jeden Tick? (nur interessehalber)
Worauf @john-0 vermutlich hinaus will ist, daß das alles keine
double
s sind sondern micro oder nano-cents.Genau. Daher meine Idee, die gebrochenen Zahlen ganzzahlig zu machen.
Es ist ja derzeit noch nichts entschieden sondern ich bin nur experimentell unterwegs um auszuloten, an welchen Stellen man optimieren kann.
-
@It0101 Da passen die Werte (voll, nicht als delta) wahrscheinlich je in 16 bit und Du musst dich nur global auf die Einheit einigen. Wäre schon nur noch 25 % Speicherbedarf.
-
@Swordfish sagte in Doubles performant ganzzahlig machen:
@It0101 Da passen die Werte (voll, nicht als delta) wahrscheinlich je in 16 bit und Du musst dich nur global auf die Einheit einigen. Wäre schon nur noch 25 % Speicherbedarf.
Du meinst als Gleitkommawert in 2 Byte speichern?