Большинство языков имеют встроенные или библиотечные функции для получения следующего или предыдущего числа с одинарной (32-битной) и / или двойной (64-битной) точностью.
Для пользователей 32-битной и 64-битной арифметики с плавающей запятой хорошее понимание основных конструкций очень полезно для избежания некоторых опасностей с ними. Стандарт IEEE применяется единообразно, но все же оставляет ряд деталей до разработчиков. Следовательно, универсальное решение для платформы, основанное на битовых манипуляциях с представлениями машинных слов, может быть проблематичным и может зависеть от таких вопросов, как порядок байтов и так далее. Хотя понимание всех мрачных деталей того, как он может или должен работать на битовом уровне, может продемонстрировать интеллектуальное мастерство, все же лучше использовать встроенное или библиотечное решение, которое адаптировано для каждой платформы и имеет универсальный API для поддерживаемых платформ.
Я заметил решения для C # и C ++. Вот некоторые из них для Java:
Math.nextUp:
public static double nextUp (double d):
- Возвращает значение с плавающей точкой рядом с d в направлении
положительная бесконечность. Этот метод семантически эквивалентен
nextAfter (d, Double.POSITIVE_INFINITY); однако следующий
реализация может выполняться быстрее, чем его эквивалентный вызов nextAfter.
Особые случаи:
- Если аргумент равен NaN, результат равен NaN.
- Если аргумент бесконечно положительный, результат положительный
бесконечность.
- Если аргумент равен нулю, результат равен Double.MIN_VALUE
Параметры:
- d - начальное значение с плавающей точкой
Возвращает:
- Смежное значение с плавающей точкой ближе к положительной бесконечности.
public static float nextUp (float f):
- Возвращает значение с плавающей точкой рядом с f в направлении
положительная бесконечность. Этот метод семантически эквивалентен
nextAfter (f, Float.POSITIVE_INFINITY); однако следующий
реализация может работать быстрее, чем эквивалентный вызов nextAfter.
Особые случаи:
- Если аргумент равен NaN, результат равен NaN.
- Если аргумент бесконечный положительный, результат положительный
бесконечность.
- Если аргумент равен нулю, результат равен Float.MIN_VALUE
Параметры:
- f - начальное значение с плавающей точкой
Возвращает:
- Смежное значение с плавающей точкой ближе к положительной бесконечности.
Следующие два более сложны в использовании. Однако направление к нулю или к положительной или отрицательной бесконечности представляется более вероятным и полезным. Другое использование состоит в том, чтобы видеть, что промежуточное значение существует между двумя значениями. Можно определить, сколько существует между двумя значениями с помощью цикла и счетчика. Кроме того, кажется, что они, наряду с методами nextUp, могут быть полезны для увеличения / уменьшения циклов for.
Math.nextAfter:
public static double nextAfter (двойной запуск,
двойное направление)
- Возвращает число с плавающей точкой рядом с первым аргументом в
Направление второго аргумента. Если оба аргумента сравниваются как
равно второй аргумент возвращается.
Особые случаи:
- Если один из аргументов является NaN, то возвращается NaN.
- Если оба аргумента являются знаковыми нулями, направление возвращается без изменений
(как подразумевается требованием возврата второго аргумента, если
аргументы сравниваются как равные).
- Если начало равно ± Double.MIN_VALUE и направление имеет значение, такое что
результат должен иметь меньшую величину, чем ноль с тем же
знак как начало возвращено.
- Если начало бесконечно, а направление имеет значение, такое, что результат
должен иметь меньшую величину, Double.MAX_VALUE с тем же знаком
как начало возвращается.
- Если начало равно ± Double.MAX_VALUE и направление имеет значение
так что результат должен иметь большую величину, бесконечность с
возвращается тот же знак, что и в начале.
Параметры:
- start - начальное значение с плавающей точкой
- direction - значение, указывающее, какой из соседей начала или начала
должен быть возвращен
Возвращает:
- Число с плавающей точкой рядом с началом в направлении
направление.
public static float nextAfter (начало плавания,
двойное направление)
- Возвращает число с плавающей точкой рядом с первым аргументом в
Направление второго аргумента. Если оба аргумента сравниваются как
равно значение, эквивалентное второму аргументу.
Особые случаи:
- Если какой-либо аргумент является NaN, то возвращается NaN.
- Если оба аргумента являются знаковыми нулями, значение эквивалентно направлению
возвращается
- Если начало равно ± Float.MIN_VALUE и направление имеет значение, такое что
результат должен иметь меньшую величину, чем ноль с тем же
знак как начало возвращается.
- Если начало бесконечно, а направление имеет такое значение, что результат
должен иметь меньшую величину, Float.MAX_VALUE с тем же знаком
как начало возвращается.
- Если начало равно ± Float.MAX_VALUE и направление имеет значение, такое
что результат должен иметь большую величину, бесконечность с тем же
знак как начало возвращается.
Параметры:
- start - начальное значение с плавающей точкой
- direction - значение, указывающее, какой из соседей или начала start должен быть возвращен
Возвращает:
- Число с плавающей точкой рядом со стартом в направлении направления.