AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Float in zwei Integer zerlegen

Ein Thema von Shark99 · begonnen am 19. Jun 2015 · letzter Beitrag vom 21. Jun 2015
Antwort Antwort
Seite 1 von 6  1 23     Letzte » 
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 19:46
Delphi-Version: 2009
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.

vk_int := Trunc(float1);

Float Nachkommanteil auch nocht recht einfach.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#2

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 19:52
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
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#3

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 19:54
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 19:56
Dann speichere es in TListItem.Data
Markus Kinzler
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#5

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 19:58
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).
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#6

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 20:08
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
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 20:08
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));
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#8

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 20:12
@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!
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#9

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 20:20
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
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Float in zwei Integer zerlegen

  Alt 19. Jun 2015, 20:24
...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...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:49 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