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 .

Antworten:


160

Ab Swift 3+ sollten Sie Folgendes verwenden:

CGFloat.greatestFiniteMagnitude
Double.greatestFiniteMagnitude
Float.greatestFiniteMagnitude

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.


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.




2

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


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)
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.