Spec-Zone.ru › C

remainder, remainderf, remainderl

Объявлено в заголовочном файле <math.h>
float       remainderf( float x, float y );
(1) (начиная с C99)
double      remainder( double x, double y );
(2) (начиная с C99)
long double remainderl( long double x, long double y );
(3) (начиная с C99)
Объявлено в заголовочном файле <tgmath.h>
#define remainder( x, y )
(4) (начиная с C99)
1-3) Вычисляет остаток по IEEE от операции деления чисел с плавающей запятой x/y.
4) Обобщённый макрос для типов: если хотя бы один аргумент имеет тип long double, вызывается remainderl. В противном случае, если хотя бы один аргумент имеет целочисленный тип или тип double, вызывается remainder. Иначе вызывается remainderf.

Вычисляемый этой функцией остаток по IEEE от операции деления чисел с плавающей запятой x/y в точности равен значению x - n * y, где значение n — целое число, ближайшее к точному значению x/y. Если |n-x/y| = ½, выбирается чётное значение n.

В отличие от fmod(), возвращаемое значение не обязательно имеет тот же знак, что и x.

Если возвращаемое значение равно 0, оно будет иметь тот же знак, что и x.

Параметры

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

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

В случае успеха возвращает остаток по IEEE от деления x/y, определённый выше.

При возникновении ошибки области определения возвращается значение, определяемое реализацией (NaN, если поддерживается).

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

Если y равно нулю, но ошибка области определения не возникает, возвращается ноль.

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

Об ошибках сообщается согласно спецификации math_errhandling.

Ошибка области определения может возникнуть, если y равно нулю.

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

  • Текущий режим округления не влияет на результат.
  • FE_INEXACT никогда не устанавливается, результат всегда точен.
  • Если x равно ±∞, а y не является NaN, возвращается NaN и устанавливается FE_INVALID.
  • Если y равно ±0, а x не является NaN, возвращается NaN и устанавливается FE_INVALID.
  • Если хотя бы один аргумент является NaN, возвращается NaN.

Примечания

POSIX требует, чтобы ошибка области определения возникала, если x бесконечно или y равно нулю.

fmod, но не remainder, полезно для незаметного преобразования чисел с плавающей запятой в беззнаковые целочисленные типы: (0.0 <= (y = fmod(rint(x), 65536.0)) ? y : 65536.0 + y) находится в диапазоне [-0.0, 65535.0], который соответствует unsigned short, тогда как remainder(rint(x), 65536.0) находится в диапазоне [-32767.0, +32768.0], выходящем за пределы диапазона signedshort.

Пример

#include <fenv.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON

int main(void)
{
    printf("remainder(+5.1, +3.0) = %.1f\n", remainder(5.1, 3));
    printf("remainder(-5.1, +3.0) = %.1f\n", remainder(-5.1, 3));
    printf("remainder(+5.1, -3.0) = %.1f\n", remainder(5.1, -3));
    printf("remainder(-5.1, -3.0) = %.1f\n", remainder(-5.1, -3));

    // special values
    printf("remainder(-0.0, 1.0) = %.1f\n", remainder(-0.0, 1));
    printf("remainder(+5.1, Inf) = %.1f\n", remainder(5.1, INFINITY));

    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("remainder(+5.1, 0) = %.1f\n", remainder(5.1, 0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID raised");
}

Вывод:

remainder(+5.1, +3.0) = -0.9
remainder(-5.1, +3.0) = 0.9
remainder(+5.1, -3.0) = -0.9
remainder(-5.1, -3.0) = 0.9
remainder(+0.0, 1.0) = 0.0
remainder(-0.0, 1.0) = -0.0
remainder(+5.1, Inf) = 5.1
remainder(+5.1, 0) = -nan
    FE_INVALID raised

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
    • 7.12.10.2 Функции вычисления остатка (стр.: TBD)
    • 7.25 Обобщённая математика для типов <tgmath.h> (стр.: TBD)
    • F.10.7.2 Функции вычисления остатка (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.12.10.2 Функции вычисления остатка (стр.: 185-186)
    • 7.25 Обобщённая математика для типов <tgmath.h> (стр.: 272-273)
    • F.10.7.2 Функции вычисления остатка (стр.: 385)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.12.10.2 Функции вычисления остатка (стр.: 254-255)
    • 7.25 Обобщённая математика для типов <tgmath.h> (стр.: 373-375)
    • F.10.7.2 Функции вычисления остатка (стр.: 529)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.12.10.2 Функции вычисления остатка (стр.: 235)
    • 7.22 Обобщённая математика для типов <tgmath.h> (стр.: 335-337)
    • F.9.7.2 Функции вычисления остатка (стр.: 465)

См. также

divldivlldiv
(C99)
вычисляет частное и остаток от целочисленного деления
(функция)
fmodfmodffmodl
(C99)(C99)
вычисляет остаток от операции деления чисел с плавающей запятой
(функция)
remquoremquofremquol
(C99)(C99)(C99)
вычисляет знаковый остаток, а также три младших бита результата деления
(функция)
Документация по C++ для remainder

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/numeric/math/remainder

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API