AGB  ·  Datenschutz  ·  Impressum  







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

Float in zwei Integer zerlegen

Ein Thema von Shark99 · begonnen am 19. Jun 2015 · letzter Beitrag vom 21. Jun 2015
Antwort Antwort
Seite 5 von 6   « Erste     345 6      
Shark99

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

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 09:42
Ja ich merke gerade Indexierung nach TDateTime war keine gute Idee. Ich kann so zwar einen bestimmten Tag blitzartig finden (der Array ist sortiert), aber abspeichern des TDateTime in einen JSON mit FloatToStr() und das Parsen um es zu laden führt zur Verfälschung der Daten (zwar Unterhalb einer Sekunde, aber ich finde damit die Duplikate nicht mehr 100% zuverlässig). Vielleicht sollte ich Unixtime oder Filetime nehmen.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#42

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 11:18
Irgendwas ist faul. Aus einem TDateTime von 42173,681694 wird durch Trunc(Frac(DateTime) * 24 * 60 * 60 * 1000) ein Integer von 58898345. Werde es wohl doch in einen String speichern müssen damit ich es wieder finde.
Bezeichne bitte nicht etwas als faul was nicht faul ist. Alles ist so wie es sein soll. Aber seit Menschengedenken weiß man, dass man Fließkommawerte nicht miteinander vergleicht, bzw. es dabei zu Problemen kommen kann. Was glaubst du bedeutet das Wort: Fließkomma?

Ich hab schon zig Projekte geschrieben in deinen ich Daten miteinander verglichen oder gesucht habe. Das klappt schon, man muss sich nur der Problematik bewußt sein.

Eben, es gibt Rundungsfehler und ich finde den Record nicht wieder.
Wenn du das Datum und Uhrzeit in zwei Integer zerlegst, warum machst du dann wieder ein Double daraus um es zu vergleichen. Warum machst du den Double mit dem du suchst nicht zu zwei Integern? Und schon ist das Problem beseitigt. Und sollte es nötig sein mit Double-Werten zu vergleichen, wie wäre es den Double zuerst zu zerlegen und dann wieder zum Double zu machen. Dann haben beide Double-Werte, der gespeicherte und der mit dem du vergleichst, die gleiche Rundungs-Ungenauigkeiten.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#43

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 12:56
Wer Fließkommazahlen auf exakte Gleichheit vergleicht, wird geteert und gefedert. Wie oft denn noch?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#44

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 13:56
Wer Fließkommazahlen auf exakte Gleichheit vergleicht, wird geteert und gefedert. Wie oft denn noch?
Blödsinn, ein Float kann sehr wohl als Index benutzt werden. Man darf nur nicht weiter rechnen damit oder ihn zerlegen und wieder zusammenfügen!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#45

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 14:19
Also wenn die Zeit als Index dient und vor allem mit anderen Zeitwerten verglichen werden soll, ist ein TDateTime (=Double) so ziemlich die schlechtest mögliche Struktur die man wählen könnte. Die Gründe werden hier fast wöchentlich durchgekaut. Nimm einfach statt eines TDateTimes eien Cardinal, hau das Datum als Unix-Timestamp da rein, und fertig ist die Laube. Passt sogar in TListItem.Data. Ab 2038 wird man vermutlich aber mal einen Wartungslauf machen müssen, oder man nimmt einen Int64 und hat ein paar Jahrtausende Ruhe (muss dann aber auch wieder Pointer im ListItem hinterlegen).
Aber mit dem Float wirst du dir irgendwann gewaltig den Rücken brechen hier.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#46

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 15:43
Ich möchte eine Gleitzahl in zwei Integer zerlegen.

Vorkomma und Nachkomma sollen jeweils zwei Integer bilden. Später will ich das ganze zusammensetzen.
Lösungen wurden schon gezeigt - hier eine Zusammenfassung:

Delphi-Quellcode:
procedure MM(s:string); begin Form1.Memo1.Lines.Add(s); end;

Function LDOUBLE(d:Double):INTEGER;
begin
  Result:= TRUNC(d);
//evtl. Zahl verschlüsseln
end;

Function RDOUBLE(d:Double):INTEGER;
begin
  Result:= TRUNC(FRAC(d) * 24 * 60 * 60 * 1000);
//evtl. Zahl verschlüsseln
end;

Function INTINTDOUBLE(a, b : INTEGER): DOUBLE;
begin
// evtl. Zahlen a und b vorher entschlüsseln
  Result:= a + (b / 24 / 60 / 60 / 1000);
end;

procedure TForm1.Button6Click(Sender: TObject);
var a, b : INTEGER;
begin
MM(DATETIMETOSTR(now));

a:= LDOUBLE(now);
b:= RDOUBLE(now);
MM('LDOUBLE: '+INTTOSTR(a));
MM('RDOUBLE: '+INTTOSTR(b));

MM('Date: '+DATETOSTR(INTINTDOUBLE(a,b)));
MM('Time: '+TIMETOSTR(INTINTDOUBLE(a,b)));
MM('ReCombined: '+DATETIMETOSTR(INTINTDOUBLE(a,b)));
end;

Geändert von hathor (21. Jun 2015 um 10:36 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#47

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 16:48
Lösungen wurden schon gezeigt - hier eine Zusammenfassung:
Wenn dann doch schon so:
Delphi-Quellcode:
procedure MM(s:string; AMemo: TMemo); begin AMemo.Lines.Add(s); end;

function LDOUBLE(d:Double):INTEGER;
begin
  Result := TRUNC(d);
end;

function RDOUBLE(d:Double):INTEGER;
begin
  Result := TRUNC(FRAC(d) * 24 * 60 * 60 * 1000);
end;

function INTINTDOUBLE(a, b : INTEGER): DOUBLE;
begin
  Result := a + (b / 24 / 60 / 60 / 1000);
end;

procedure TForm1.Button6Click(Sender: TObject);
var a, b : INTEGER;
begin
  MM(DATETIMETOSTR(now),Self.Memo1);

  a := LDOUBLE(now);
  b := RDOUBLE(now);
  MM('LDOUBLE: '+INTTOSTR(a),Self.Memo1);
  MM('RDOUBLE: '+INTTOSTR(b),Self.Memo1);

  MM('Date: '+DATETOSTR(INTINTDOUBLE(a,b)),Self.Memo1);
  MM('Time: '+TIMETOSTR(INTINTDOUBLE(a,b)),Self.Memo1);
  MM('ReCombined: '+DATETIMETOSTR(INTINTDOUBLE(a,b)),Self.Memo1);
end;
Wir wollen ja keine Instanzen der Form verärgern.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#48

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 17:05
Oder du benutzt:

Delphi-Quellcode:
function DateTimeToFileDate(DateTime: TDateTime): Integer;
//Delphi Datum (Double) in Betriebsystem Zeitstempel (Integer)
um Delphi-Datum in ein Integer zu konvertieren.

Zurück geht es so:

Delphi-Quellcode:
function FileDateToDateTime(FileDate: Integer): TDateTime;
//Betriebsystem Zeitstempel (Integer) in Delphi Datum (Double)
Einschränkungen:
Der Zeitstempel fängt 01.01.1980 an, Delphi-Datum dagegen 01.01.1900. Die Funktionen berücksichtigen das, so dass man nichts selbst dazurechnen oder abziehen muss, aber es sind keine Daten möglich die kleiner 1980 sind.

Weitere Einschränkungen: es werden keine Millisekunden gesichert. Und zuallerletzt, ich habe das Gefühl, dass irgendwer hier pfuscht und nicht jede Sekunde gespeichert wird, sondern jede zweite Sekunde. Vielleicht weil man so ein Bit spart.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#49

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 17:44
Wer Fließkommazahlen auf exakte Gleichheit vergleicht, wird geteert und gefedert. Wie oft denn noch?
Blödsinn, ein Float kann sehr wohl als Index benutzt werden. Man darf nur nicht weiter rechnen damit oder ihn zerlegen und wieder zusammenfügen!
Und das ist dann auch Blödsinn. Natürlich darf man rechnen, zerlegen und wieder zusammenfügen. Nur e-x-a-k-t v-e-r-g-l-e-i-c-h-e-n nicht. Aber Dir muss ich das ja nicht erklären, sondern höchstens um Formulierungen ringen.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#50

AW: Float in zwei Integer zerlegen

  Alt 20. Jun 2015, 20:45
Wer Fließkommazahlen auf exakte Gleichheit vergleicht, wird geteert und gefedert. Wie oft denn noch?
Blödsinn, ein Float kann sehr wohl als Index benutzt werden. Man darf nur nicht weiter rechnen damit oder ihn zerlegen und wieder zusammenfügen!
Und das ist dann auch Blödsinn. Natürlich darf man rechnen, zerlegen und wieder zusammenfügen. Nur e-x-a-k-t v-e-r-g-l-e-i-c-h-e-n nicht. Aber Dir muss ich das ja nicht erklären, sondern höchstens um Formulierungen ringen.
Irgendwie bezweifle ich den Nutzen eines Indexes, den man nur beinahe vergleichen kann.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 6   « Erste     345 6      


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 09:03 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