Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Float in zwei Integer zerlegen (https://www.delphipraxis.net/185560-float-zwei-integer-zerlegen.html)

Shark99 19. Jun 2015 19:46

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.

Dalai 19. Jun 2015 19:52

AW: Float in zwei Integer zerlegen
 
Zitat:

Zitat von Shark99 (Beitrag 1305802)
Es geht darum dass ich die Zeitangabe (TDateTime) in einem ListView speichern muss und wollte dazu zwei ungenutzte Integer properties verwenden.

Warum dann dieser Umweg? Speichere doch direkt den TDateTime/Double im ListView. Oder hast du mit den Integers sonst noch etwas vor?

MfG Dalai

Shark99 19. Jun 2015 19:54

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.

mkinzler 19. Jun 2015 19:56

AW: Float in zwei Integer zerlegen
 
Dann speichere es in TListItem.Data

Shark99 19. Jun 2015 19:58

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).

Dalai 19. Jun 2015 20:08

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:
var li: TListItem;
    d: TDateTime;
begin
  li:= ListView1.Items.Item[0];
  d:= Now;
  li.Data:= Pointer(d);
end;
Und auslesen geht dann umgekehrt:
Delphi-Quellcode:
var li: TListItem;
    d: TDateTime;
begin
  li:= ListView1.Items.Item[0];
  d:= TDateTime(li.Data);
end;
Man muss nur aufpassen, dass man wirklich exakt den Datentyp ausliest, den man reinsteckt, sonst kann es böse knallen.

MfG Dalai

Popov 19. Jun 2015 20:08

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));

Shark99 19. Jun 2015 20:12

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!

Dalai 19. Jun 2015 20:20

AW: Float in zwei Integer zerlegen
 
Zitat:

Zitat von Shark99 (Beitrag 1305811)
Hab aber wie gesagt Bedenken.

Ich glaube nicht, dass das ein Problem ist, denn es wird da nur ein Pointer auf etwas - hier TDateTime - gespeichert. Oder wie denkst du, funktioniert das bei Objekten, die ewig lange Strings enthalten können, die weit größer als 4 Byte sind?

MfG Dalai

Dejan Vu 19. Jun 2015 20:24

AW: Float in zwei Integer zerlegen
 
Zitat:

Zitat von Shark99 (Beitrag 1305808)
...Es kostet Performance die hier sehr wichtig ist.

Wie kann denn das sein? TListView und Performance? Entschuldige, aber bist Du Dir da ganz sicher? Wir reden hier von einem Windows Control. Da passt das mit dieser 'Performance' einfach nicht.

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 02:49 Uhr.
Seite 1 von 6  1 23     Letzte » 

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