【问题标题】:How to find max value for Double and Float in Swift如何在 Swift 中找到 Double 和 Float 的最大值
【发布时间】:2015-04-16 00:32:56
【问题描述】:

目前正在学习 Swift,有一些方法可以为不同类型的 Integer 找到 maxmin 值,例如 Int.maxInt.min .

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

【问题讨论】:

    标签: swift floating-point int double infinity


    【解决方案1】:

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

    CGFloat.greatestFiniteMagnitude
    Double.greatestFiniteMagnitude
    Float.greatestFiniteMagnitude
    

    【讨论】:

    • 如果您也对在 Linux 上编译代码感兴趣,这就是答案。
    【解决方案2】:

    虽然没有 Double.max,但它在 C 的 float.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
    

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

    【讨论】:

    • 我尝试在 Xcode 操场上编写代码,并为 Double 获取 (+infinity),为 Float 获取 340,282,346,638,529,000,000,000,000,000,000,000,000.0。为什么 Double 和 Int64 都是 64 位的,而 double 可以存储更多的数字?
    • 你需要了解浮点表示。从wikipedia articlethis intro 开始
    • 对于将最大值/最小值与比较运算符一起使用的常见情况,DBL_MAX 将始终给出有效结果。
    • 在 Swift 3 中已弃用,现在是 Double.greatestFiniteMagnitude
    【解决方案3】:

    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 中使用。

    【讨论】:

      【解决方案4】:

      随便写

          let mxFloat = MAXFLOAT
      

      你会在 swif 中得到最大的 float 值。

      【讨论】:

      • 这不会在 linux 上编译
      【解决方案5】:

      所有这些都使用 swift 5。

      【讨论】:

        【解决方案6】:

        CGFloat.infinityDouble.infinity.infinity 在这种情况下也很有用。

        【讨论】:

          【解决方案7】:

          适用于 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)
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-14
            • 1970-01-01
            相关资源
            最近更新 更多