Як знайти максимальне значення для Double and Float в Swift


77

Поточне навчання Swift, є способи знайти максимальне та мінімальне значення для різних типів цілих чисел, таких як Int.maxі Int.min.

Чи можна знайти максимальне значення для Double і Float? Більше того, до якого документа мені слід звернутися для такого роду запитань? Зараз я читаю програму Apple Swift Language Programming .

Відповіді:


161

Станом на Swift 3+ ви повинні використовувати:

CGFloat.greatestFiniteMagnitude
Double.greatestFiniteMagnitude
Float.greatestFiniteMagnitude

4
Це відповідь, якщо вас також цікавить компіляція коду на Linux.
Mike Pollard

74

Хоча ні Double.max, це визначено в float.hзаголовку C , до якого ви можете отримати доступ у Swift через import Darwin.

import Darwin

let fmax = FLT_MAX
let dmax = DBL_MAX

Це приблизно 3.4 * 10^38і 1.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

Отже, перед тим, як вдатися до деяких обчислень, які можуть зрівнятися з цими межами, ви, мабуть, повинні прочитати про плаваючу крапку. Тут і тут , мабуть, вдалий старт.


Я намагаюся (+infinity)кодувати вас на ігровому майданчику Xcode і отримую Double та 340,282,346,638,529,000,000,000,000,000,000,000,000.0 для Float. Чому Double і Int64 мають 64-бітні, але double можуть зберігати більше номерів?
Метрополіс,

4
Вам потрібно дізнатись про подання з плаваючою комою. Почніть із статті зі Вікіпедії, а також із цього вступу
Швидкість повітряної швидкості

1
У типовому випадку використання максимальних / мінімальних значень з операторами порівняння DBL_MAX завжди даватиме достовірні результати.
Джаррод Сміт

18
Знято в Swift 3, це заразDouble.greatestFiniteMagnitude
Джон Монтгомері,

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
}

Не використовуйте малі та малі регістри - ці символи використовуються в Swift 3.




3

Крім того CGFloat.infinity, Double.infinityабо просто .infinityможе бути корисним у таких ситуаціях.


1

Працює зі Свіфтом 5

public extension Double {

    /// Max double value.
    static var max: Double {
        return Double(greatestFiniteMagnitude)
    }

    /// Min double value.
    static var min: Double {
        return Double(-greatestFiniteMagnitude)
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.