Namespaces
Variants

nextafter, nextafterf, nextafterl, nexttoward, nexttowardf, nexttowardl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
nextafter nexttoward
(C99) (C99)
(C23) (C23)
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
Fast operation indicators
Определено в заголовке <math.h>
float nextafterf ( float from, float to ) ;
(1) (начиная с C99)
double nextafter ( double from, double to ) ;
(2) (начиная с C99)
long double nextafterl ( long double from, long double to ) ;
(3) (начиная с C99)
float nexttowardf ( float from, long double to ) ;
(4) (начиная с C99)
double nexttoward ( double from, long double to ) ;
(5) (начиная с C99)
long double nexttowardl ( long double from, long double to ) ;
(6) (начиная с C99)
Определено в заголовке <tgmath.h>
#define nextafter(from, to)
(7) (начиная с C99)
#define nexttoward(from, to)
(8) (начиная с C99)
1-3) Сначала преобразует оба аргумента к типу функции, затем возвращает следующее представимое значение from в направлении to . Если from равно to , to возвращается.
4-6) Сначала преобразует первый аргумент в тип функции, затем возвращает следующее представимое значение from в направлении to . Если from равно to , to возвращается, преобразованное из long double в возвращаемый тип функции без потери диапазона или точности.
7) Макрос общего типа: Если любой аргумент имеет тип long double , nextafterl вызывается. В противном случае, если любой аргумент имеет целочисленный тип или тип double , nextafter вызывается. В противном случае, nextafterf вызывается.
8) Макрос общего типа: Если аргумент from имеет тип long double , nexttowardl вызывается. В противном случае, если from имеет целочисленный тип или тип double , nexttoward вызывается. В противном случае nexttowardf вызывается.

Содержание

Параметры

from, to - значения с плавающей запятой

Возвращаемое значение

Если ошибок не возникает, возвращается следующее представимое значение from в направлении to . Если from равно to , тогда возвращается to , преобразованное в тип функции.

Если происходит ошибка диапазона из-за переполнения, возвращается ± HUGE_VAL , ±HUGE_VALF , или ±HUGE_VALL (с тем же знаком, что и from ).

Если происходит ошибка диапазона из-за потери значимости (underflow), возвращается корректный результат.

Обработка ошибок

Ошибки сообщаются, как указано в math_errhandling .

Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),

  • если from конечно, но ожидаемый результат является бесконечностью, возбуждает FE_INEXACT и FE_OVERFLOW .
  • если from не равно to и результат является субнормальным или нулевым, возбуждает FE_INEXACT и FE_UNDERFLOW .
  • в любом случае возвращаемое значение не зависит от текущего режима округления
  • если либо from либо to является NaN, возвращается NaN.

Примечания

POSIX определяет что условия переполнения и потери значимости являются ошибками диапазона ( errno может быть установлен).

IEC 60559 рекомендует, чтобы from возвращалось всякий раз, когда from == to . Эти функции вместо этого возвращают to , что делает поведение вокруг нуля последовательным: nextafter(-0.0, +0.0) возвращает + 0.0 , а nextafter(+0.0, -0.0) возвращает - 0.0 .

nextafter обычно реализуется через манипуляции с IEEE представлением ( glibc musl ).

Пример

#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
int main(void)
{
    float from1 = 0, to1 = nextafterf(from1, 1);
    printf("Следующее представимое число с плавающей запятой после %.2f это %.20g (%a)\n", from1, to1, to1);
    float from2 = 1, to2 = nextafterf(from2, 2);
    printf("Следующее представимое число с плавающей запятой после %.2f это %.20f (%a)\n", from2, to2, to2);
    double from3 = nextafter(0.1, 0), to3 = 0.1;
    printf("Число 0.1 находится между двумя допустимыми значениями double:\n"
           "    %.56f (%a)\nи %.55f  (%a)\n", from3, from3, to3, to3);
    // разница между nextafter и nexttoward:
    long double dir = nextafterl(from1, 1); // первое субнормальное long double
    float x = nextafterf(from1, dir); // сначала преобразует dir в float, получая 0
    printf("Используя nextafter, следующее число float после %.2f (%a) это %.20g (%a)\n",
           from1, from1, x, x);
    x = nexttowardf(from1, dir);
    printf("Используя nexttoward, следующее число float после %.2f (%a) это %.20g (%a)\n",
           from1, from1, x, x);
    // специальные значения
    {
        #pragma STDC FENV_ACCESS ON
        feclearexcept(FE_ALL_EXCEPT);
        double from4 = DBL_MAX, to4 = nextafter(from4, INFINITY);
        printf("Следующее представимое число double после %.2g (%a) это %.23f (%a)\n",
               from4, from4, to4, to4);
        if(fetestexcept(FE_OVERFLOW)) puts("   вызвано FE_OVERFLOW");
        if(fetestexcept(FE_INEXACT)) puts("   вызвано FE_INEXACT");
    } // конец блока FENV_ACCESS
    float from5 = 0.0, to5 = nextafter(from5, -0.0);
    printf("nextafter(+0.0, -0.0) дает %.2g (%a)\n", to5, to5);
}

Вывод:

Следующее представимое число с плавающей запятой после 0.00 это 1.4012984643248170709e-45 (0x1p-149)
Следующее представимое число с плавающей запятой после 1.00 это 1.00000011920928955078 (0x1.000002p+0)
Число 0.1 находится между двумя допустимыми значениями double:
    0.09999999999999999167332731531132594682276248931884765625 (0x1.9999999999999p-4)
и 0.1000000000000000055511151231257827021181583404541015625  (0x1.999999999999ap-4)
Используя nextafter, следующее число float после 0.00 (0x0p+0) это 0 (0x0p+0)
Используя nexttoward, следующее число float после 0.00 (0x0p+0) это 1.4012984643248170709e-45 (0x1p-149)
Следующее представимое число double после 1.8e+308 (0x1.fffffffffffffp+1023) это inf (inf)
   вызвано FE_OVERFLOW
   вызвано FE_INEXACT
nextafter(+0.0, -0.0) дает -0 (-0x0p+0)

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.12.11.3 Функции nextafter (стр.: TBD)
  • 7.12.11.4 Функции nexttoward (стр.: TBD)
  • 7.25 Обобщённая математика <tgmath.h> (стр.: TBD)
  • F.10.8.3 Функции nextafter (стр.: TBD)
  • F.10.8.4 Функции nexttoward (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.12.11.3 Функции nextafter (стр. 187)
  • 7.12.11.4 Функции nexttoward (стр. 187)
  • 7.25 Обобщенная математика <tgmath.h> (стр. 272-273)
  • F.10.8.3 Функции nextafter (стр. 386)
  • F.10.8.4 Функции nexttoward (стр. 386)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.12.11.3 Функции nextafter (стр. 256)
  • 7.12.11.4 Функции nexttoward (стр. 257)
  • 7.25 Обобщенная математика <tgmath.h> (стр. 373-375)
  • F.10.8.3 Функции nextafter (стр. 529)
  • F.10.8.4 Функции nexttoward (стр. 529)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.12.11.3 Функции nextafter (стр. 237)
  • 7.12.11.4 Функции nexttoward (стр. 238)
  • 7.22 Обобщенная математика <tgmath.h> (стр. 335-337)
  • F.9.8.3 Функции nextafter (стр. 466)
  • F.9.8.4 Функции nexttoward (стр. 466)

Смотрите также