2014-04-29 12 views
5

Hinweis: Diese Frage wurde bearbeitet, weil mein Problem etwas völlig anderes wurde. Sie finden die direkte Antwort auf die Frage What's the keyword for the maximal value for a floating point type? in MBo's answer - verwenden Sie die System.Math-Konstanten.In Delphi, was ist das Schlüsselwort für den maximalen Wert für einen Gleitkommatyp?

Delphi stellt mehrere Gleitkommawerttypen zur Verfügung. Es gibt Single, Double und Extended für den Anfang.

Letzte Woche habe ich nachgeschlagen, was das Schlüsselwort für den Maximalwert Floating-Point ist und diese gefunden: http://www.delphibasics.co.uk/RTL.asp?Name=Infinity

var 
    float1, float2 : single; 
begin 
    float1 := Infinity; 
    float2 := 23; 

    ShowMessage('float1 = '+FloatToStr(float1)); 
    ShowMessage('float2 = '+FloatToStr(float2)); 
    ShowMessage('float1 - float2 = '+FloatToStr(float1 - float2)); 
    ShowMessage('-float1 = '+FloatToStr(-float1)); 
end; 

Mit vermeintlichen Ausgang

float1 = INF 
float2 = 23 
float1 - float2 = INF 
-float1 = -INF 

Ich habe ein Formular mit einer Komponente auf sie . Diese Komponente hat einige Attribute. Wenn ich den Eigenschaftseditor verwenden, um Infinity als Wert für das Gleitkommaattribut zu setzen, erhalte ich den Fehler, dass es ein ungültiger Gleitkommawert ist. Gleiches gilt für INF.

Dann tippte ich 9.9E308 in das Feld MaxValue. Es wurde in INF umgewandelt.

Form Attributes

Gefühl eher erfreut darüber, sparte ich meine Form und ging mit meiner Arbeit an. Ich kompilierte das Formular später an diesem Tag und prüfte erfolgreich, dass das Formular einen Wert von 1E308 enthalten konnte.

Am nächsten Tag ...

Error on restarting IDE

die .dfm Datei in Notepad öffnen, gibt mir diese:

object gridDoubleEditor: TdgmrGridDoubleEdit 
    Tag = 0 
    WantKeyLeftRight = False 
    WantKeyUpDown = False 
    WantKeyHomeEnd = False 
    WantKeyPriorNext = False 
    EmptyString = '--' 
    EmptyValue = -1E300 
    MinValue = -1E300 
    MaxValue = INF 
    NumberOfDecimals = 2 
    Alignment = taRightJustify 
    Left = 336 
    Top = 208 
end 

Wie kommt es kompiliert automatisch 9.9E308 zu INF ändert, erfolgreich, erfolgreich gespeichert, aber nicht geladen? Ist das ein Fehler in meiner IDE? Ich verwende Embarcadero® Delphi® XE5 Version 19.0.14356.6604, 32 Bit unter Windows 7.

+0

Wenn ein merkwürdiger Fehler auftritt, ist das erste, was zu tun ist, um IDE zu schließen/wieder zu öffnen, das Projekt erneut zu öffnen und das Projekt neu zu erstellen (nicht nur neu zu kompilieren). – kludg

Antwort

4

System.Math Einheit enthält Infinity Konstante, um IEEE754 Inf Pseudowiderstand (1.0/0.0) darzustellen. Es gibt auch viele Konstanten MaxDouble, MaxExtended usw. in diesem Gerät (siehe Variables section here). Dieser kurze Test funktioniert nach Bedarf, daher vermute ich, dass Ihre Komponente eine Bereichsüberprüfung oder einen Eigenschaftseditor hat, der unbekannte Identifikatoren nicht versteht.

TTest = class(TComponent) 
    private 
    FValue: Double; 
    procedure SetValue(const Value: Double); 
    public 
    property Value: Double read FValue write SetValue; 
    end; 


procedure TForm1.Button26Click(Sender: TObject); 
begin 
    with TTest.Create(Self) do try 
    Value := Infinity; 
    Caption := FloatToStr(Value); 
    finally 
    Free; 
    end; 
end; 

P.S. Müssen Sie Infinity als Feldwert verwenden oder nur um sicherzustellen, dass der Feldwert> -1E300 ist?

P.P.S. Warum verwenden Sie immer noch INF, nicht Infinity? BTW, ich habe eine Komponente mit Float veröffentlicht Eigenschaft gefunden - Objektinspektor nicht verstehen Infinity - so Eigenschaft Editor ist nicht für diese Zwecke ausgelegt, wie ich schon angenommen habe, aber ich kann Infinity Code zuweisen.

+0

Gibt es eine Möglichkeit, auf diese Konstanten zuzugreifen, damit ich sie Attributen eines Formularobjekts zuordnen kann? Das Importieren von System.Math erlaubt es mir, einer Gleitkommavariablen eine Unendlichkeit zuzuweisen, aber ich kann den Wert immer noch nicht einer Eigenschaft meines Formularobjekts zuweisen. Es heißt "Infinity ist kein gültiger Gleitkommawert" (eine ähnliche Meldung erscheint für alle Varianten - "System.Math.Infinity", "Math.Infinity", "MaxSingle", "Math.MaxSingle", "System.Math". MaxSingle' ...) – Pimgd

+0

Oh, ich habe deine Frage falsch gelesen (habe INF angeschaut, Infinity nicht bemerkt). Können Sie 96-97 Zeilen des Codes anzeigen, der diesen Fehler verursacht? – MBo

+0

Das waren nur Testlinien, mit var f: Double; beginnen f: = INF; f: = Unendlichkeit; Ende ... – Pimgd