В двоичных представлениях с плавающей запятой IEEE-754, если оба аргумента nextafter
конечны, а два аргумента не равны, результат можно вычислить, либо сложив один из них, либо вычтя один из представления переосмысленного числа как целое число без знака [Примечание 1]. (Небольшая) сложность является результатом правильного обращения с угловыми случаями, которые не отвечают этим предварительным условиям, но в целом вы обнаружите, что это очень быстро.
Помимо NaN, единственное, что имеет значение для второго аргумента, это то, больше ли он, меньше или равен первому аргументу.
Интерфейс в основном обеспечивает дополнительную ясность для результатов углового случая, но это также иногда полезно. В частности, использование nextafter(x, 0)
, которое усекается независимо от знака, часто удобно. Вы также можете воспользоваться тем фактом, что nextafter(x, x);
равен x
, чтобы ограничить результат произвольным значением.
Разница между nextafter
и nexttowards
заключается в том, что последний позволяет использовать больший динамический диапазон long double
; опять же, это помогает в определенных угловых случаях.
- Строго говоря, если первый аргумент является нулем некоторого знака, а другой аргумент является допустимым ненулевым числом противоположного знака, то перед этим аргументом необходимо перевернуть его бит знака. Но это казалось слишком легальным, чтобы добавить это в список, и это вряд ли сложное преобразование.