AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Wozu ist die CompilerVersion vom Typ Extended ?

Wozu ist die CompilerVersion vom Typ Extended ?

Ein Thema von Rollo62 · begonnen am 30. Jul 2020 · letzter Beitrag vom 31. Jul 2020
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.175 Beiträge
 
Delphi 12 Athens
 
#1

AW: Wozu ist die CompilerVersion vom Typ Extended ?

  Alt 31. Jul 2020, 06:25
Na schön, ich gehe halt immer gerne auf Nummer sicher.

Du meinst also bei
Delphi-Quellcode:
 
CONST
  CompilerVersion: Single = 34;
 
CONST
  MyCompilerVersion: Single = 34;

Result := CompilerVersion = MyCompilerVersion; // Ok, weil gleiche Typen, gleiche Bitkodierung
wäre ein direkter Vergleich möglich ?
Ist ja auch die identische Bitkodierung.

Nur wenn ich direkte konstante Zahlen, und keine mit Typ deklarierten Konstanten, im Vergleich eingebe
dann könnte das den Unterschied ausmachen.

Delphi-Quellcode:
 
CONST
  CompilerVersion: Single = 34;

Result := CompilerVersion = 34.0; // Möglicherweise OK, wenn intrinsische Typumwandlung 34.0 auf Extended
Result := CompilerVersion = 34; // Problematisch weil womöglicherweise verschiedene Typen (Integer)
Es gibt ein paar interessante Links dazu:
http://www.delphibasics.co.uk/Article.asp?Name=Numbers
http://rvelthuis.de/articles/articles-floats.html

aber irgendwie finde ich gerade nicht welchen Typ ( ABC = 34.0) eine nicht-deklarierte Konstante eigentlich bekommt.
- nimmt die den Typ an, den ABC hat ? (davon gehe ich eigentlich aus (= der Compiler optimiert so dass keine Conversion nötig ist)
- wird die immer zu Extended (conversion könnte passieren) ?
- wird die immer zu Double (conversion könnte passieren) ?

Bei Embarcadero habe ich auf die Schnelle nichts dazu gefunden ( gibt es aber bestimmt).

Geändert von Rollo62 (31. Jul 2020 um 06:34 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
724 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Wozu ist die CompilerVersion vom Typ Extended ?

  Alt 31. Jul 2020, 07:25
Nicht jede Dezimal-Zahl ist binär exakt codierbar. Bereits hier könnte es ohne eindeutige Typangaben zu internen Rundungsfehlern kommen. Beispiel:
Delphi-Quellcode:
CONST
  CompilerVersion_e: Extended = 34.1;
  CompilerVersion_s: Single = 34.1;
  CompilerVersion_d: Double = 34.1;

  CompilerVersion_o = 34.1; // o: Ohne Typangabe

Begin
    WriteLn('Extended = Single: Ist Gleich? = ', CompilerVersion_e = CompilerVersion_s);
    WriteLn;
    WriteLn('Extended = Double: Ist Gleich? = ', CompilerVersion_e = CompilerVersion_d);
    WriteLn;
    WriteLn('Extended = Extended: Ist Gleich? = ', CompilerVersion_e = CompilerVersion_e);
    WriteLn;
    WriteLn('Extended = OHNE Typ: Ist Gleich? = ', CompilerVersion_e = CompilerVersion_o);
    WriteLn;

    WriteLn('SizeOf(CompilerVersion_e) = ', SizeOf(CompilerVersion_e));
    WriteLn('SizeOf(CompilerVersion_s) = ', SizeOf(CompilerVersion_s));
    WriteLn('SizeOf(CompilerVersion_d) = ', SizeOf(CompilerVersion_d));
    WriteLn('SizeOf(CompilerVersion_o) = ', SizeOf(CompilerVersion_o));
    
    ReadLn;
End;
Inndiesem Fall (34.1) ist:
(Extended = Single) ---> False
(Extended = Single) ---> False
(Extended = Double) ---> True
(Extended = Extended) ---> True
(Extended = Ohne Typ) ---> True // Der Compiler verwendet hier automatisch Double

Warum? Weil die Dezimalzahl 34.1 binär nicht exakt darstellbar ist und je nach Real-Type intern „ein bißchen“ anders aussieht.

Ändern wir die Konstanten jeweils auf 34, so sieht es ganz anders aus: Alle Vergleiche liefern True, aber für die nicht-typisierte Konstante hat der Compiler (XE5) den Datentype Byte gewählt.
Fazit: Um das Ergebnis des Vergleichs nicht dem Zufall & der Compilerversion zu überlassen, sollten wir die Konstante durch Typisierung eindeutig festlegen.
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#3

AW: Wozu ist die CompilerVersion vom Typ Extended ?

  Alt 31. Jul 2020, 08:47
Currency wäre hier bestimmt vollkommen ausreichend und "optimaler" gewesen.

Aber für ganze und halbe Versionen sollte es meisten kein Probleme bereiten.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.652 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wozu ist die CompilerVersion vom Typ Extended ?

  Alt 31. Jul 2020, 10:18
Nicht jede Dezimal-Zahl ist binär exakt codierbar.
Korrekt! Allerdings haben wir hier einen besonderen Fall: Die Compiler-Version bleibt in absehbarer Zeit vermutlich zweistellig und die Nachkommastelle ist wohl allenfalls eine 5 (=½) und sonst 0. Damit lässt sich diese Zahl auch immer exakt als Extended (vermutlich sogar Double oder Single) darstellen. Um alle ganzen und halben Versionen bis 127.5 darzustellen braucht es gerade mal die ersten 7 Bit in der Mantisse und die letzten 3 vom Exponent.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
724 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Wozu ist die CompilerVersion vom Typ Extended ?

  Alt 31. Jul 2020, 14:35
Vielleicht stimmt das nicht ganz: denn selbst die Dezimalzahl 0.1 läßt sich binär nur durch einen unendlich nichtperiodischen binären Wert darstellen, also nicht exakt, sondern nur gerundet. Und wenn ich nach 32 Bit, 64 Bit oder 80 Bit runde, kommen "ein bißchen" andere Werte raus, wodurch die absolute Gleichheit nicht mehr besteht, weil u. U. ein Bit anders gesetzt ist.
Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
724 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Wozu ist die CompilerVersion vom Typ Extended ?

  Alt 31. Jul 2020, 15:17
Meine Vermutung – warum sich Mr. Turbo Pascal & Embarcadero für den DatenType Extended entschieden hat – ist, daß der inzwischen stets vorhandene mathematische Coprozessor (Intel/AMD) reelle Zahlen immer mit der vollen "Bandbreite" von 80 Bit (= Extended) verarbeitet, egal ob die Werte als 32 oder 64 etc. Bit vorliegen.
Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.175 Beiträge
 
Delphi 12 Athens
 
#7

AW: Wozu ist die CompilerVersion vom Typ Extended ?

  Alt 31. Jul 2020, 16:12
Nicht nur das es für den Zweck der sinnloseste aller Typen ist,
es ist auch noch der Typ welcher auf jeder Platform anders ist.
Clipboard03.jpg

Das wird vielleicht nochmal interessant wenn RadStudio wirklich auf Win64, Macos und sonstwas portiert ist.

Selbst mit der kleinsten maximalen Versionsnummer von 1.79e+308 bleibt Embarcadero wohl noch genug Zeit für die Portierung
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#8

AW: Wozu ist die CompilerVersion vom Typ Extended ?

  Alt 31. Jul 2020, 16:57
Ich verstehe das Problem nicht.

Selbst wenn das auf jeder Plattform anders ist, dann bleibt ein typischer Vergleich {$if CompilerVersion>=35.5} auf allen Plattformen doch gültig, egal mit wie vielen Bits die Gleitkommazahl dargestellt wird. Das hat ja Uwe bereits sehr deutlich dargestellt.

Eine Diskussion über ein Problem das es mit der CompilerVersion 40.1 geben könnte, ist an den Haaren herbei gezogen. Ich würde diese Diskussion einfach auf den Tag verschieben, an dem es die CompilerVersion 40.1 o.ä dann gibt.
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
724 Beiträge
 
Delphi XE5 Professional
 
#9

AW: Wozu ist die CompilerVersion vom Typ Extended ?

  Alt 31. Jul 2020, 17:02
Nicht nur dass es für den Zweck der sinnloseste aller Typen ist, es ist auch noch der Typ welcher auf jeder Platform anders ist.
Könnte sein, daß es historisch gewachsen ist. Für numerische Berechnungen (= mein Schwerpunkt) ist Extended der sinnvollste Datentyp. Noch besser wäre eine noch höhere Genauigkeit (mindestens 256 Bit), die es leider nicht gibt. Und für die Zielplattform 64-Bit steht leider
Delphi-Quellcode:
Type
  Extended = Double;
was - für meine Aufgaben - ein absoluter Rückschritt ist. Deswegen bleibe ich weiterhin auf der 32-Bit-Zielplattform. Das war wahrscheinlich der kleinste gemeinsame Nenner, nachdem alle MicroSoft-Produkte & Compiler (C#, C++) und auch Fortran keinen Extended-Datentyp kennen. Muß wohl weiterhin Multipräzisions-Routinen verwenden, um meinen Genauigkeitsansprüchen gerecht zu werden...
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Antwort Antwort

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 02:51 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-2025 by Thomas Breitkreuz