2015-02-15 14 views

risposta

52

Mentre non c'è il numero Double.max, è definito nell'intestazione C float.h, a cui è possibile accedere in Swift tramite import Darwin.

import Darwin 

let fmax = FLT_MAX 
let dmax = DBL_MAX 

Questi sono approssimativamente 3.4 * 10^38 e 1.79 * 10^308 rispettivamente.

Ma tenete a mente che non è così semplice con i numeri in virgola mobile (non è mai semplice con i numeri in virgola mobile). Quando si tiene numeri questo grande, si perde di precisione in un modo simile a perdere in precisione con numeri molto piccoli, in modo da:

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 

Quindi, prima di entrare in alcuni calcoli che potrebbero eventualmente rispolverare contro questi limiti, probabilmente si dovrebbe leggere su in virgola mobile. Here e here sono probabilmente un buon inizio. risposta

+0

Sto provando il codice nel parco giochi Xcode e ottieni '(+ infinito)' per Double e 340.282.346.638.529.000.000.000.000.000.000.000.000.000.0 per Float. Perché Double e Int64 hanno entrambi 64 bit ma il doppio può memorizzare più numeri? –

+3

È necessario conoscere la rappresentazione in virgola mobile. Inizia con [articolo wikipedia] (http://en.wikipedia.org/wiki/Floating_point) e anche [questa intro] (http://introcs.cs.princeton.edu/java/91float/) –

+0

Grazie mille tanto. Li leggerò tutti. –

8

di AV va bene, ma trovo quelle macro difficile da ricordare e un po 'non ovvio, così alla fine ho fatto Double.MIN e amici di lavoro:

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

Non usare min minuscole e max - questi simboli sono usati in Swift 3.

71

Come di Swift 3, si dovrebbe usare:

CGFloat.greatestFiniteMagnitude 
Double.greatestFiniteMagnitude 
Float.greatestFiniteMagnitude 
+0

Questa è la risposta se sei interessato a compilare il codice anche su Linux. –

2

solo scrivere

let mxFloat = MAXFLOAT 

Otterrete il valore massimo del galleggiante in swif.

+0

Questo non verrà compilato su linux –

Problemi correlati