![]() |
Delphi-Version: 2009
Float in zwei Integer zerlegen
Ich möchte eine Gleitzahl in zwei Integer zerlegen.
Vorkomma und Nachkomma sollen jeweils zwei Integer bilden. Später will ich das ganze zusammensetzen. Es sollte möglichst performant sein, also kein Umweg über Strings. Vorkomma ist ganz einfach.
Delphi-Quellcode:
vk_int := Trunc(float1);
Float Nachkommanteil auch nocht recht einfach.
Delphi-Quellcode:
nk_float := Frac(float1);
Wie kann ich aber nun das ganze in eine Ganzzahl wandeln, also z.B. wenn nk_float 0.345 ist, wie mache ich eine 345 daraus und bei 0.14 eine 14? Wenn ich die beiden Integer dann habe, wie füge ich die Nachkommastelle wieder ein um ein Float zu bilden (um das ganze rückgängig zu machen). -- Es geht darum dass ich die Zeitangabe (TDateTime) in einem ListView speichern muss und wollte dazu zwei ungenutzte Integer properties verwenden. |
AW: Float in zwei Integer zerlegen
Zitat:
MfG Dalai |
AW: Float in zwei Integer zerlegen
Ich kann die Zeit nicht in dem Listview (Items) direkt speichern, weil der User sie nicht sehen sollte.
Ich habe Daten in einem dynamischen Array (muss sehr performant sein, TList kommt nicht in Frage). Ich zeige dann Daten daraus in einem Listview. Der Array ist nach Zeit indiziert (ohne Duplikate) und ich muss ein TDateTime in das Listview irgendwie reinquetschen um schnell ein Listview Item wieder im Array zu finden. |
AW: Float in zwei Integer zerlegen
Dann speichere es in TListItem.Data
|
AW: Float in zwei Integer zerlegen
Das war meine erste Idee, aber dazu muss ich mit Objekten rumhantieren, Speicher allozieren etc. Es kostet Performance die hier sehr wichtig ist. Ich dachte ich zerlege TDateTime in zwei Integer und speichere sie im ImageIndex (Vorkomma) und OverlayIndex (die im Listview nicht verwendet werden).
|
AW: Float in zwei Integer zerlegen
Und? Es hindert dich doch keiner daran, den Wert in TListItem.Data abzulegen.
TListView.Items beinhaltet alle Items und ist vom Typ TListItems. TListItems.Item wiederum bietet Zugriff auf jedes einzelne TListItem. Und TListItem.Data ist ein beliebig verwendbarer Pointer. Das ginge in etwa so:
Delphi-Quellcode:
Und auslesen geht dann umgekehrt:
var li: TListItem;
d: TDateTime; begin li:= ListView1.Items.Item[0]; d:= Now; li.Data:= Pointer(d); end;
Delphi-Quellcode:
Man muss nur aufpassen, dass man wirklich exakt den Datentyp ausliest, den man reinsteckt, sonst kann es böse knallen.
var li: TListItem;
d: TDateTime; begin li:= ListView1.Items.Item[0]; d:= TDateTime(li.Data); end; MfG Dalai |
AW: Float in zwei Integer zerlegen
Ich hab die letzten paar Tage in einer Zeitschleife zu hängen, alternativ permanent Deja-Vus zu erleben. Jeder will plötzlich Datum und Zeit zerlegen.
Ich hab jetzt keine Zeit um zu zeigen wie das mit Objekten klappt, vielleicht später (Edit: Dalai hat es gerade gemacht). Hier die Integer-Variante:
Delphi-Quellcode:
Datum := Trunc(Now);
Zeit := Trunc(Frac(Now) * 24 * 60 * 60 * 1000); //und zurück DatumUndZeit := Datum + (Zeit / 24 / 60 / 60 / 1000); ShowMessage(DateTimeToStr(DatumUndZeit)); |
AW: Float in zwei Integer zerlegen
@Dalai
Ich habe angenommen dass unter 32Bit ein Pointer aus 4 Bytes besteht und der Platz nicht ausreicht um eine Gleitkommazahl darin abzuspeichern. Es wäre Klasse wenn ich TDateTime direkt in .Data reinpressen kann. Hab aber wie gesagt Bedenken. @Popov Danke! |
AW: Float in zwei Integer zerlegen
Zitat:
MfG Dalai |
AW: Float in zwei Integer zerlegen
Zitat:
Was willst Du eigentlich machen? @Dalai: Do speicherst keinen Zeiger auf ein TDateTime, sondern Du kopierst die obersten (untersten, je nach Blickwinkel) 4 Bytes des TDateTime in einen 32-bit Wert. Kleiner Unterschied... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz