2014-04-29 32 views
5

Uwaga: to pytanie zostało zmodyfikowane, ponieważ mój problem stał się czymś zupełnie innym. Bezpośrednia odpowiedź na pytanie: What's the keyword for the maximal value for a floating point type? w MBo's answer - użyj stałych System.Math.W Delphi, jakie jest słowo kluczowe dla maksymalnej wartości dla typu zmiennoprzecinkowego?

Delphi udostępnia wiele typów wartości zmiennoprzecinkowych. Na początek są pojedyncze, podwójne i rozszerzone.

zeszłym tygodniu Spojrzałem w górę, co słowo kluczowe jest dla maksymalnej wartości zmiennoprzecinkowe i znalazłem to: 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; 

Z rzekomym wyjściu

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

Mam formularz z komponentu na nim . Ten składnik ma kilka atrybutów. Jeśli używam edytora właściwości do wstawienia Infinity jako wartości atrybutu zmiennoprzecinkowego, pojawia się błąd, że jest to niepoprawna wartość zmiennoprzecinkowa. To samo dotyczy INF.

Następnie wpisałem 9.9E308 w polu MaxValue. Przekształcił się w INF.

Form Attributes

Uczucie raczej zadowolony o tym, że uratował mi formularz i udał się z mojej pracy. Skompilowałem formularz później tego dnia, z powodzeniem testując, że formularz może mieć wartość 1E308.

Następnego dnia ...

Error on restarting IDE

Otwarcie pliku .dfm w notatniku daje mi to:

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 

Jak to się stało, że automatycznie zmienia 9.9E308 do INF, kompiluje pomyślnie, zapisuje się pomyślnie, ale nie ładuje się? Czy to błąd w moim IDE? Używam Embarcadero® Delphi® XE5 wersja 19.0.14356.6604, 32 bity na Windows 7.

+0

Jeśli wystąpi dziwny błąd, pierwszą rzeczą do zrobienia jest zamknięcie/ponowne otwarcie IDE, ponowne otwarcie projektu i przebudowanie (a nie tylko rekompilacja) projektu. – kludg

Odpowiedz

4

Jednostka System.Math zawiera Infinity stałą reprezentującą pseudovalue Inf IEEE754 Inf (1,0/0,0). W tej jednostce jest również dużo stałych MaxDouble, MaxExtended itd. (Spójrz na Variables section here). Ten krótki test działa w razie potrzeby, więc podejrzewam, że Twój komponent może mieć pewien zakres sprawdzania zasięgu lub edytor właściwości, który nie rozumie nieznanych identyfikatorów.

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. Czy musisz używać Infinity jako wartości pola, lub po prostu, aby upewnić się, że wartość pola> -1E300?

P.P.S. Dlaczego nadal używasz INF, nie Infinity? BTW, Znalazłem jeden komponent z opublikowaną właściwością float - Inspektor obiektów nie rozumie nieskończoności - więc edytora właściwości nie jest przeznaczony do tych celów, jak już przypuszczałem, ale mogę przypisać Infinity w kodzie.

+0

Czy istnieje sposób dostępu do tych stałych, aby móc przypisać je do atrybutów obiektu formularza? Importowanie System.Math pozwala mi przypisać Infinity do zmiennej zmiennoprzecinkowej, ale nadal nie mogę przypisać wartości do właściwości mojego obiektu formularza. Mówi "Infinity nie jest poprawną wartością zmiennoprzecinkową" (podobny komunikat pojawia się dla wszystkich wariantów - 'System.Math.Infinity',' Math.Infinity', 'MaxSingle',' Math.MaxSingle', 'System.Math. MaxSingle' ...) – Pimgd

+0

Och, źle odczytałem twoje pytanie (spojrzałem na INF, nie zauważyłem Infinity). Czy możesz pokazać 96-97 linii kodu, który powoduje ten błąd. – MBo

+0

To były właśnie linie testujące, z var f: Double; Rozpocznij f: = INF; f: = Infinity; koniec ... – Pimgd