Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi LOW oder High für NICHT-INTEGER-Typen (https://www.delphipraxis.net/84820-low-oder-high-fuer-nicht-integer-typen.html)

QuickAndDirty 22. Jan 2007 12:47


LOW oder High für NICHT-INTEGER-Typen
 
Wie schon die Überschrift sagt gibt es sowas wie LOW und HIGH auch für Typen
Wie TDatetime, Double, Single andere Gleitkommazahlen?

Wenn nicht, wie Sollte ich so eine Funktion Schreiben?
1. Aus der Hilfe die Zahlen als Konstanten verbauen.
2. Einen Puffer der richtigen Größe anlegen, ihn mit dem Richtigen Bitmuster beschreiben und dann Typcasten.
2.b Wie ist in den Double, Single, etc. Exponent und Mantisse auf die Bytes verteilt?

mkinzler 22. Jan 2007 12:52

Re: LOW oder High für NICHT-INTEGER-Typen
 
Was soll dann z.B. für TDatetime rauskommen?
LOW/HIGH hat m.E. nichts mit dem belegten Speicherplatz zu tun.

QuickAndDirty 22. Jan 2007 12:56

Re: LOW oder High für NICHT-INTEGER-Typen
 
Das Höchste oder das Niedrigste darstellbare Datum natürlich.
Ich brauche es für einen Range auf einen kombinierten Schlüssel wobei ich nur das erste Feld einschränken möchte.
Leider liefert mir der Range leere Mengen wenn nicht auch das 2. Feld des Schlüssels vernünftig gesetzt wird.

sirius 22. Jan 2007 13:02

Re: LOW oder High für NICHT-INTEGER-Typen
 
High and low ist nur für ordinale Typen (Zahlen) möglich.

Bei Fließkommazahlen würd ich mir einfach Konstanten ausrechnen:
Double: 1 VZ + 11 Exp + 52 Mantisse
Single: 1 VZ + 8 Exp + 23 Matisse

Aber aufpassen, wo beim Exponenten die "Mitte" ist und dann gibts noch Inifinity und NaN.

QuickAndDirty 22. Jan 2007 13:13

Re: LOW oder High für NICHT-INTEGER-Typen
 
Funktioniert infinity in delphi23?
Würde dann nicht auch -infinity bis +infinity gehen?
Und kennen die BDE treiber INFINITY?

Wieso beim Exponenten auf die Mitte aufpassen?
Müste der nicht bei
(Beispiel 8 Bit Exponent )
mantisse * 2 ^ 00000000 = mantisse * 2 ^ 0 sein
und bei
mantisse * 2 ^ 11111111 = mantisse * 2 ^ -127 sein
und bei
mantisse * 2 ^ 01111111 = mantisse * 2 ^ 126 sein

Oder funktioniert er anders? Der Exponent ist doch ein Integer-Typ oder?

Oh ich glaube zu wissen was du mit Mitte meintest. Du meintest das , die höchste positive Zahl +1 in die kleinste negative überläuft.

Wo sind in den Doublewerten die Werte NAN und Infinity untergebracht?

sirius 22. Jan 2007 13:33

Re: LOW oder High für NICHT-INTEGER-Typen
 
Ja, das meinte ich mit Mitte.


nach IEEE (e=Exponent; m=Mantisse; v=Vorzeichen):

Single
NaN: e=255 und m<>0 und v->egal
+Inf: e=255 und m=0 und v=0
-Inf: e=255 und m=0 und v=1
+0 : e=0 und m=0 und v=0
-0 : e=0 und m=0 und v=1
Für alle 0<e<255 ziehst du einfach 127 vom Exponenten ab und rechnest, wie du es schon getan hast.
:!: Für e=0 und m<>0 ist der Exponente (auch) -126 :!:

Double
NaN: e=2047 und m<>0 und v->egal
+Inf: e=2047 und m=0 und v=0
-Inf: e=2047 und m=0 und v=1
+0 : e=0 und m=0 und v=0
-0 : e=0 und m=0 und v=1
Für alle 0<e<2047 ziehst du einfach 1023 vom Exponenten ab und rechnest, wie du es schon getan hast.
:!: Für e=0 und m<>0 ist der Exponente (auch) -1022 :!:

Alle Angaben ohne Gewähr


Was die einzelnen Programme (z.B. BDE) aus dem Standard machen ist ihre Sache (oder auch deine). Ich "als BDE" würde die Bits einfach so weitergeben..

QuickAndDirty 22. Jan 2007 13:43

Re: LOW oder High für NICHT-INTEGER-Typen
 
Zitat:

Zitat von sirius
Alle Angaben ohne Gewähr

Besten Dank. Das ist ja voll der Service hier. :dp:

Zitat:

Zitat von sirius
Was die einzelnen Programme (z.B. BDE) aus dem Standard machen ist ihre Sache (oder auch deine). Ich "als BDE" würde die Bits einfach so weitergeben..

Ich weiß was du meinst... ich "als BDE" hätte mich nach dem ich gecancelt wurde in ein OPEN-Source Projekt verwandelt...auch wenn es peinlich geworden wäre....wirklich.

sirius 22. Jan 2007 13:50

Re: LOW oder High für NICHT-INTEGER-Typen
 
Zitat:

Zitat von QuickAndDirty
Ich weiß was du meinst... ich "als BDE" hätte mich nach dem ich gecancelt wurde in ein OPEN-Source Projekt verwandelt...auch wenn es peinlich geworden wäre....wirklich.

:lol: :lol: :lol:


Um noch zu Extended zu kommen. Der Standard lässt da (in Schranken) variable Breiten für e und m zu.

Ich glaube Delphi nimmt für den Exponenten 15, dann sicherlich wieder "nur" 1 fürs Vorzeichen und der Rest, also *grübel* 64 Bits für die Mantisse. NaN und Infinity wirds da in ähnlicher Form geben.

Edit: Auch ja, und für TDateTime...
Für Delphi ist ja der Tag 0 am 30.12.1899, TDateTime=Double; Und für Delphi gibts kein "vor Christus"


Edit: peinlicher Rechenfehler korrigiert

3_of_8 22. Jan 2007 14:08

Re: LOW oder High für NICHT-INTEGER-Typen
 
Aber Delphi kann doch sicher vorchristliche Daten darstellen... :gruebel:

Robert Marquardt 22. Jan 2007 14:09

Re: LOW oder High für NICHT-INTEGER-Typen
 
Man sollte sich vor Augen halten wofuer Low und High gedacht sind. Sie sollen die obere und untere Grenze fuer Arrays liefern (ob statische oder dynamische). Da Arrays aber auch mit Ordinaltypen deklariert werden koennen, muss man Low und High auch auf diesen definieren.
Die gleichen Extremwerte gibt es fuer die Integer-Typen auch als Konstanten wie MaxInt. Fuer die genannten anderen Typen genuegen Konstanten (gibt es da nicht schon vordefinierte?).

sirius 22. Jan 2007 14:13

Re: LOW oder High für NICHT-INTEGER-Typen
 
Zitat:

Zitat von 3_of_8
Aber Delphi kann doch sicher vorchristliche Daten darstellen... :gruebel:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var d:TDatetime;
begin
  d:=-700000; //inkl. ausreichend Puffer für andere Kalenderformen
  edit1.Text:=datetimetostr(d);
end;

//Ausgabe: "00.00.0000"
Nööööö :roteyes:

Können wir ja froh sein, dass Delphi noch ein paar Tage vor dem Technikzeitalter kennt.

QuickAndDirty 22. Jan 2007 14:13

Re: LOW oder High für NICHT-INTEGER-Typen
 
Zitat:

Zitat von sirius
Um noch zu Extended zu kommen. Der Standard lässt da (in Schranken) variable Breiten für e und m zu.

Ich glaube Delphi nimmt für den Exponenten 15, dann sicherlich wieder "nur" 1 fürs Vorzeichen und der Rest, also *grübel* 48 Bits für die Mantisse. NaN und Infinity wirds da in ähnlicher Form geben.

Naja der Typ ist für Datenbanken halt nicht so interressant.

Zitat:

Zitat von sirius
Edit: Auch ja, und für TDateTime...
Für Delphi ist ja der Tag 0 am 30.12.1899, TDateTime=Double; Und für Delphi gibts kein "vor Christus"

Das mit Tdatetime= Double war mir klar. Und auch die Basisdatum Problematik (M$ 1.1.1900 Borland 30.12.1899 )
ist mir in der Hinsicht leidlich bekannnt. (*erinner*)
Aber warum gibt es kein "vor Christus" ? Ich meine wenn wir Schaltjahre nicht beachten sind es bis 0 von heute an
nur -732555 Tage. Das müste auch mit dem Double machbar sein. Das einzige Problem was ich mir bei Kleinen Daten(Datumsesese) vorstellen könnte ist das Problem der im Angelsächsischen Raum verspäteten Einführung des Gregorieanischen Kalenders. Die Komponente
TDatetime Picker macht deswegen zum Beispiel Stress bei Daten vor 1715....Ok ich gebe zu das das für die meisten Anwendungfälle ausreicht.

Zitat:

Zitat von sirius
Nööööö Rotating Eyes

eeeeek :cyclops:

sirius 22. Jan 2007 14:16

Re: LOW oder High für NICHT-INTEGER-Typen
 
Zitat:

Zitat von Robert Marquardt
(gibt es da nicht schon vordefinierte?).

:wall: Das wäre ja zu einfach:
MaxExtended
MaxDouble
MaxDateTime
.
.
.
MinSingle
MinExtended
:wall:


Und für "3 über 8"
Zitat:

Zitat von Delphi-Hilfe
const

MinDateTime: TDateTime = -657434.0; { 01/01/0100 12:00:00.000 AM }
MaxDateTime: TDateTime = 2958465.99999; { 31/12/9999 11:59:59.999 PM }

Edit :gruebel: MinDate=-657434 ... HEy, ich bin bis 0 gekommen

sirius 22. Jan 2007 14:20

Re: LOW oder High für NICHT-INTEGER-Typen
 
Zitat:

Zitat von QuickAndDirty
Und auch die Basisdatum Problematik (M$ 1.1.1900 Borland 30.12.1899 )

Und bei MatLab ist es 1.1.0000 und Unix (die ja auch noch in Sekunden zählen) 1970 und Internetzeit......

QuickAndDirty 22. Jan 2007 14:24

Re: LOW oder High für NICHT-INTEGER-Typen
 
Ja 0 scheint den meisten einfach zu fantasielos zu sein......wäre ja auch gelacht, wenn jeder SQL Ausdruck in dem in TDATETIME Feldern nur Uhrzeiten gespeichert werden sollen das gleiche Basisdatum vorne drann bekäme.

zu KOnstanten:
*unbeteiligt pfeifend*
Wer wer stellt hier im Forum auch immer so dumme Fragen.
*unbeteilgt pfeifend*

3_of_8 22. Jan 2007 14:28

Re: LOW oder High für NICHT-INTEGER-Typen
 
Ein Double nimmt auch negative Werte auf.

Daher müsste es doch eigentlich möglich sein, "negative" Daten, also Daten vor dem 30.12.1899 anzugeben. Kann aber sein, dass die DateUtils nicht darauf ausgerichtet sind.

QuickAndDirty 22. Jan 2007 14:31

Re: LOW oder High für NICHT-INTEGER-Typen
 
Zitat:

Zitat von 3_of_8
Ein Double nimmt auch negative Werte auf.

Daher müsste es doch eigentlich möglich sein, "negative" Daten, also Daten vor dem 30.12.1899 anzugeben. Kann aber sein, dass die DateUtils nicht darauf ausgerichtet sind.

Wie gesagt. Ich halte es für ein Problem das der Julianische Kalender nicht überall gleichzeitig vom Gregorianischen Kalender abgelöst wurde.
Es kann auch ein Problem sein das überhaupt ein Kalender den anderen abgelöst hat.

sirius 22. Jan 2007 14:38

Re: LOW oder High für NICHT-INTEGER-Typen
 
Zitat:

Zitat von 3_of_8
Ein Double nimmt auch negative Werte auf.

Daher müsste es doch eigentlich möglich sein, "negative" Daten, also Daten vor dem 30.12.1899 anzugeben. Kann aber sein, dass die DateUtils nicht darauf ausgerichtet sind.

Das macht Double ja auch, bis zum Jahre 0, was etwa -650000 entspricht.

3_of_8 22. Jan 2007 14:39

Re: LOW oder High für NICHT-INTEGER-Typen
 
Man müsste allerdings auch noch weiter zurückgehen können, wenn man die DateUtils umgeht und eigene Routinen dafür schreibt. Die Kalendersache ist dabei natürlich etwas im Weg.

QuickAndDirty 22. Jan 2007 14:44

Re: LOW oder High für NICHT-INTEGER-Typen
 
Habs mir überlegt mein gelaber vom Kalender ist Blödsinn.
Wenn die das bis 0 schaffen, dann haben sie diese Frage schonmal irgendwie gelöst.

sirius 22. Jan 2007 15:43

Re: LOW oder High für NICHT-INTEGER-Typen
 
So, um die Sache noch aufzulösen, was Dateutils macht:

-erstmal einen TimeStamp-wert (Bezugsdatum 0 = 1.1.0000)
-dann gleich eine If-Abfrage, wenn der Wert<0 ist werden alle Datumswerte (Jahr, Monat, Tag...) auf 0 gesetzt
-er rechnet komplett im gregorianischen Kalender (soweit ich das sehe) als würde der schon immer gelten; es gibt keinen Umbruch


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