Cách tìm giá trị tối đa cho Double và Float trong Swift


77

Học Swift hiện tại, có nhiều cách để tìm giá trị maxmin cho các loại Integer khác nhau như Int.maxInt.min.

Có cách nào để tìm giá trị tối đa cho Double và Float không? Hơn nữa, tôi nên tham khảo tài liệu nào cho dạng câu hỏi này? Tôi hiện đang đọc Ngôn ngữ lập trình Swift của Apple .

Câu trả lời:


161

Kể từ Swift 3+, bạn nên sử dụng:

CGFloat.greatestFiniteMagnitude
Double.greatestFiniteMagnitude
Float.greatestFiniteMagnitude

4
Đây là câu trả lời nếu bạn cũng quan tâm đến việc biên dịch mã của mình trên Linux.
Mike Pollard

74

Trong khi không có Double.max, nó được định nghĩa trong float.htiêu đề C , bạn có thể truy cập trong Swift thông qua import Darwin.

import Darwin

let fmax = FLT_MAX
let dmax = DBL_MAX

Đây là khoảng 3.4 * 10^381.79 * 10^308tương ứng.

Nhưng hãy nhớ rằng nó không đơn giản như vậy với số dấu phẩy động (nó không bao giờ đơn giản với số dấu phẩy động). Khi giữ các số lớn như vậy, bạn sẽ mất độ chính xác theo cách tương tự như mất độ chính xác với các số rất nhỏ, vì vậy:

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

Vì vậy, trước khi bạn tham gia vào một số phép tính có thể vượt qua những giới hạn này, bạn có thể nên đọc về dấu phẩy động. Đâyđây có lẽ là một khởi đầu tốt.


Tôi đang thử bạn viết mã trong sân chơi Xcode và nhận được (+infinity)Double và 340.282.346.638.529.000.000.000.000.000.000.000.000.000.000.0 cho Float. Tại sao Double và Int64 đều có 64bit nhưng double có thể lưu trữ nhiều số hơn?
Metropolis

4
Bạn cần tìm hiểu về biểu diễn dấu phẩy động. Bắt đầu với bài viết wikipedia và cả phần giới thiệu này
Airspeed Velocity

1
Đối với trường hợp phổ biến là sử dụng các giá trị max / min với toán tử so sánh DBL_MAX sẽ luôn cho kết quả hợp lệ.
Jarrod Smith

18
Bị phản đối ở Swift 3, nó bây giờDouble.greatestFiniteMagnitude
John Montgomery

11

Câu trả lời của AV là tốt, nhưng tôi thấy những macro đó khó nhớ và hơi không rõ ràng, vì vậy cuối cùng tôi Double.MINvà bạn bè đã làm việc:

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

Không sử dụng chữ in thường min và max - những ký hiệu đó được sử dụng trong Swift 3.


7

Chỉ viết

    let mxFloat = MAXFLOAT

Bạn sẽ nhận được giá trị lớn nhất của float trong swif.


Điều này sẽ không biên dịch trên Linux
Mike Pollard


3

Ngoài ra CGFloat.infinity, Double.infinityhoặc chỉ .infinitycó thể hữu ích trong những tình huống như vậy.


1

Hoạt động với 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)
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.