如何在Swift中找到Double和Float的最大值


76

当前正在学习Swift,有多种方法可以找到不同类型的Integer(例如和)的最大值最小值Int.maxInt.min

有没有一种方法可以找到Double和Float的最大值?此外,对于此类问题,我应该参考哪个文件?我目前正在阅读Apple的The Swift Programming Language

Answers:


160

从Swift 3+开始,您应该使用:

CGFloat.greatestFiniteMagnitude
Double.greatestFiniteMagnitude
Float.greatestFiniteMagnitude

4
如果您也对Linux上的代码编译感兴趣,这就是答案。
Mike Pollard

73

虽然没有Double.max,但它在Cfloat.h标头中定义,您可以通过在Swift中访问它import Darwin

import Darwin

let fmax = FLT_MAX
let dmax = DBL_MAX

这些分别是3.4 * 10^381.79 * 10^308

但是请记住,使用浮点数并不是那么简单(使用浮点数绝不是那么简单)。当持有这么大的数字时,您失去精度的方式类似于失去非常小的数字时的精度,因此:

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

因此,在进行一些可能超出这些限制的计算之前,您应该阅读浮点数。 这里这里可能是一个好的开始。


我尝试您在Xcode操场上进行编码,并获得(+infinity)Double和Float的340,282,346,638,529,000,000,000,000,000,000,000,000,000,000.0。为什么Double和Int64都具有64位,但是double可以存储更多数字?
Metropolis

4
您需要了解浮点表示法。从维基百科文章以及此介绍开始
空速Velocity 2015年

1
对于在比较运算符中使用最大值/最小值的常见情况,DBL_MAX将始终给出有效的结果。
加罗德·史密斯

18
在Swift 3中已弃用,现在为Double.greatestFiniteMagnitude
John Montgomery

11

AV的答案很好,但是我发现这些宏很难记住并且不太明显,因此最终我Double.MIN和朋友一起工作:

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

不要使用小写的min和max-在Swift 3中使用这些符号。




2

另外CGFloat.infinityDouble.infinity或只是.infinity在这种情况下很有用。


1

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)
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.