![]() |
AW: Maßeinheiten als Typen
Zitat:
![]() |
AW: Maßeinheiten als Typen
Du hast mich missverstanden, macht ja nichts, ich wollte nicht sagen das Du etwas von mir hast, ich wollte fast das selbe schreiben, sagte ich ja.
Gute Hilfe, weiter so. |
AW: Maßeinheiten als Typen
Zitat:
Letzteres ist ein nicht zu unterschätzendes Problem, wenn es auf Genauigkeit ankommt. Da wäre es evtl. sinnvoll, zum Speichern des Wertes statt eines Fließkommatyps einen Integer in einer Einheit zu verwenden, die klein genug ist, um alles notwendige abzubilden, z.B. 1 mg oder auch 1 ug (vorausgesetzt kleinere Massen interessieren nicht). Oder man kombiniert einen Integer mit einem dezimalen Exponenten. d.h. Bei Zuweisung von 1 mg speichert man 1 als Wert und -1000000 als Exponent. Liest man dann den Wert in g aus, erhält man 0.001. twm |
AW: Maßeinheiten als Typen
Zitat:
|
AW: Maßeinheiten als Typen
@dummzeuch
Es ist zu kompliziert, dass der Typ exakt das speichert was man dem zugewiesen hat? Das ist nicht höchtens sondern genau der Vorteil dieser Implementierung. So gut wie keine Veränderung der zugewiesenen Daten (bis auf die allgemeine Problem mit den Fließkommazahlen). Es geht hier auch nicht darum ein höchst exakt rechnendes System vorzustellen, sondern nur einen Typen, der so genau ist wie Delphi selber rechnet aber mit Dimensionen/Einheiten umgehen kann. Aber man kann es ja auch wie folgt deklarieren:
Delphi-Quellcode:
dann implementierst du einen gaaaaaanz genauen Float-Type und tauscht den dort gegen Extended aus.
TValueType = Extended;
TMassUnit = (Undefined, Gram, Kilogram, Milligram, Tonne); TMass = record private FValue: TValueType; // Wert FUnit: TMassUnit; // Einheit public constructor Create(AValue: TValueType; AUnit: TMassUnit); property Value: TValueType read FValue; property &Unit: TMassUnit read FUnit; private function AsBaseUnit(): TValueType; function AsBaseNumericType(AUnit: TMassUnit); public property Grams: TValueType index TMassUnit.Gram read AsBaseNumericType; property Kilograms: TValueType index TMassUnit.Kilogram read AsBaseNumericType; property Milligrams: TValueType index TMassUnit.Milligram read AsBaseNumericType; property Tonnes: TValueType index TMassUnit.Tonne read AsBaseNumericType; end; PS Achja, ich vergaß noch einen (in meinen Augen) Vorteil: Wenn man sich beim debuggen die lokalen Variablen anschaut, dann erscheint dort z.B.:
Code:
Finde ich persönlich eingängiger, als wenn dort lediglich
(15,Gram)
Code:
steht (die basiseinheit ist ja Kilogramm)
(0.015)
Und wenn man dann noch
Delphi-Quellcode:
implementiert, dann ist es doch auch schön wenn dort 15g ausgegeben wird und eben nicht 0,015kg, eben immer so wie man es der Variablen auch zugewiesen hat.
ToString()
|
AW: Maßeinheiten als Typen
Zitat:
vgl hierzu Currency! Gruß K-H |
AW: Maßeinheiten als Typen
Sorry versteh ich immer noch nicht. Nach
![]() Wir verwenden fast grundsätzlich Double, welche als Länge in Millimeter oder als Bogenmass definiert sind. Umgerechnet werden die nur bei der Ein- und Ausgabe. |
AW: Maßeinheiten als Typen
Zitat:
Int64 hat, wie double auch, 64-Bit. Sein Ganzzahliger Wertebereich ist aber größer als der von Double. Dafür kann ich den kleineren Wertebereich von Double genauer auflösen. Alternativ kann man auch Extended verwenden, der dann 80 Bit(32-Bit win) hat und noch genauer auflöst. Ob man nun Fließkomma oder Ganzzahlige Werte benutzt, kommt auf den Context an. u.U. ist auch eine Festkomma Aritmethik eine Option. |
AW: Maßeinheiten als Typen
Ich hab den Vorschlag von Uwe Raabe mal aufgegriffen und das ganze testhalber mal wie folgt
aufgebaut:
Delphi-Quellcode:
Damit hätte ich die meisten Anforderungen eigentlich abgedeckt. Was meint ihr ?
TYPE
TGramm = -9223372036854775807..9223372036854775807; TKilo = -9223372036854775..9223372036854775; TTonne = -9223372036854..9223372036854; TMegat = -9223372036..9223372036; TGewicht = Record private fvalue : int64; strict private Class constructor Create; //<-- Hier werden die Classvars entsprechend belegt private class var GrammPerKilo : int64; GrammPerTonne: int64; GrammPerMegat: int64; public Class Operator Implicit(const value:int64):TGewicht; Class Operator Implicit(const value:TGewicht):int64; Class Operator Implicit(const value:TGramm):TGewicht; Class Operator Implicit(const value:TKilo):TGewicht; Class Operator Implicit(const value:TTonne):TGewicht; Class Operator Implicit(const value:TMegat):TGewicht; Class Operator Add(const left,right:TGewicht):TGewicht; Class Operator Subtract(const left,right:TGewicht):TGewicht; End; |
AW: Maßeinheiten als Typen
Welche Anforderungen? Die des Ausgangspostings? Dann meine ich Ja.
Bei den Anforderungen die ich an sowas hätte Nein. Wenn ich 1437 Gramm hätte und das als Kilogramm wollte, dann würde ich schon 1.437 Kilogramm wollen. Die private class var verstehe ich nicht so recht. Reichen da nicht Konstanten? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 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 by Thomas Breitkreuz