So finden Sie den Maximalwert für Double und Float in Swift

76

Aktuelles Lernen Swift, es gibt Möglichkeiten, Max- und Min- Werte für verschiedene Arten von Ganzzahlen wie Int.maxund zu finden Int.min.

Gibt es eine Möglichkeit, den Maximalwert für Double und Float zu ermitteln? Welches Dokument sollte ich für diese Art von Frage verwenden? Ich lese gerade Apples The Swift Programming Language .

Metropole
quelle

Antworten:

160

Ab Swift 3+ sollten Sie Folgendes verwenden:

CGFloat.greatestFiniteMagnitude
Double.greatestFiniteMagnitude
Float.greatestFiniteMagnitude
Vadoff
quelle
4
Dies ist die Antwort, wenn Sie daran interessiert sind, Ihren Code auch unter Linux zu kompilieren.
Mike Pollard
73

Während es keine gibt Double.max, ist es im C- float.hHeader definiert, auf den Sie in Swift über zugreifen können import Darwin.

import Darwin

let fmax = FLT_MAX
let dmax = DBL_MAX

Dies sind grob 3.4 * 10^38und 1.79 * 10^308jeweils.

Aber denken Sie daran, dass es mit Gleitkommazahlen nicht so einfach ist (mit Gleitkommazahlen ist es nie so einfach). Wenn Sie so große Zahlen halten, verlieren Sie die Genauigkeit auf ähnliche Weise wie bei sehr kleinen Zahlen.

let d = DBL_MAX
let e = d - 1.0
let diff = d - e
diff == 0.0  // true

let maxPlusOne = DBL_MAX + 1
maxPlusOne == d  // true

let inf = DBL_MAX * 2
// perhaps infinity is the “maximum” 
inf == Double.infinity  // true

Bevor Sie sich also mit Berechnungen befassen, die möglicherweise diese Grenzen überschreiten, sollten Sie sich wahrscheinlich über Gleitkomma informieren. Hier und hier sind wohl ein guter Anfang.

Fluggeschwindigkeit
quelle
Ich versuche, Sie Code in Xcode Spielplatz und bekommen (+infinity)für Double und 340.282.346.638.529.000.000.000.000.000.000.000.000.000 für Float. Warum haben Double und Int64 beide 64 Bit, aber Double kann mehr Zahlen speichern?
Metropolis
4
Sie müssen etwas über die Gleitkommadarstellung lernen. Beginnen Sie mit dem Wikipedia-Artikel und auch diesem Intro
Airspeed Velocity
1
Für den allgemeinen Fall der Verwendung von Max / Min-Werten mit Vergleichsoperatoren liefert DBL_MAX immer gültige Ergebnisse.
Jarrod Smith
18
In Swift 3 veraltet, ist es jetztDouble.greatestFiniteMagnitude
John Montgomery
11

Die Antwort von AV ist in Ordnung, aber ich finde diese Makros schwer zu merken und ein bisschen nicht offensichtlich, also habe ich schließlich dafür gesorgt, dass Double.MINFreunde arbeiten:

extension Double {
    static var MIN     = -DBL_MAX
    static var MAX_NEG = -DBL_MIN
    static var MIN_POS =  DBL_MIN
    static var MAX     =  DBL_MAX
}

Verwenden Sie keine Klein- und Kleinbuchstaben - diese Symbole werden in Swift 3 verwendet.

AmigoNico
quelle
7

Einfach schreiben

    let mxFloat = MAXFLOAT

Sie erhalten den Maximalwert von float in swif.

Praveen Kumar
quelle
Dies wird nicht unter Linux kompiliert
Mike Pollard
4

Alle mit Swift 5.

Geben Sie hier die Bildbeschreibung ein

Schattiger Mostafa
quelle
2

Auch CGFloat.infinity, Double.infinityoder gerade .infinityin solchen Situationen nützlich sein.

Renetik
quelle
1

Funktioniert mit Swift 5

public extension Double {

    /// Max double value.
    static var max: Double {
        return Double(greatestFiniteMagnitude)
    }

    /// Min double value.
    static var min: Double {
        return Double(-greatestFiniteMagnitude)
    }
}
Volodymyr Kulyk
quelle