How to find max value for Double and Float in Swift
Asked Answered
R

6

101

Current learning Swift, there are ways to find max and min value for different kind of Integer like Int.max and Int.min.

Is there a way to find max value for Double and Float? Moreover, which document should I refer for this kind of question? I am currently reading Apple's The Swift Programming Language.

Rowlett answered 15/2, 2015 at 11:15 Comment(0)
C
200

As of Swift 3+, you should use:

CGFloat.greatestFiniteMagnitude
Double.greatestFiniteMagnitude
Float.greatestFiniteMagnitude
Chavarria answered 11/11, 2016 at 22:37 Comment(1)
This is the answer if you are interested in your code compiling on Linux too.Indemnify
G
75

While there’s no Double.max, it is defined in the C float.h header, which you can access in Swift via import Darwin.

import Darwin

let fmax = FLT_MAX
let dmax = DBL_MAX

These are roughly 3.4 * 10^38 and 1.79 * 10^308 respectively.

But bear in mind it’s not so simple with floating point numbers (it’s never simple with floating point numbers). When holding numbers this large, you lose precision in a similar way to losing precision with very small numbers, so:

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

So before you get into some calculations that might possibly brush up against these limits, you should probably read up on floating point. Here and here are probably a good start.

Galloglass answered 15/2, 2015 at 12:23 Comment(4)
I am try you code in Xcode playground and get (+infinity) for Double and 340,282,346,638,529,000,000,000,000,000,000,000,000.0 for Float. Why Double and Int64 both have 64bit but double can store more numbers?Rowlett
You need to learn about floating point representation. Start with the wikipedia article and also this introGalloglass
For the common case of using max/min values with comparison operators DBL_MAX will always give valid results.Presnell
Deprecated in Swift 3, it's now Double.greatestFiniteMagnitudeDoralia
U
11

AV's answer is fine, but I find those macros hard to remember and a bit non-obvious, so eventually I made Double.MIN and friends work:

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

Don't use lowercase min and max -- those symbols are used in Swift 3.

Unhitch answered 18/5, 2016 at 6:42 Comment(0)
B
7

Just write

let mxFloat = MAXFLOAT

You will get the maximum value of a float in Swift.

Blithering answered 27/2, 2017 at 9:34 Comment(1)
This will not compile on linuxIndemnify
C
4

Also CGFloat.infinity, Double.infinity or just .infinity can be useful in such situations.

Citral answered 10/3, 2020 at 20:4 Comment(0)
P
3

Works with 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)
    }
}
Pouched answered 28/1, 2020 at 7:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.