Namespaces
Variants

remquo, remquof, remquol

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
remquo
(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
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 remquof ( float x, float y, int * quo ) ;
(1) (C99부터)
double remquo ( double x, double y, int * quo ) ;
(2) (C99부터)
long double remquol ( long double x, long double y, int * quo ) ;
(3) (C99부터)
헤더에 정의됨 <tgmath.h>
#define remquo( x, y, quo )
(4) (C99부터)
1-3) remainder() 함수와 동일하게 나눗셈 연산 x / y 의 부동소수점 나머지를 계산합니다. 추가적으로, x / y 의 부호와 최소한 마지막 비트 중 세 개 이상이 quo 에 저장되어, 주기 내에서 결과의 팔분위(octant)를 결정하기에 충분합니다.
4) 타입-제네릭 매크로: 비포인터 인수 중 하나라도 long double 타입을 가지면 remquol 이 호출됩니다. 그렇지 않고 비포인터 인수 중 하나라도 정수 타입이거나 double 타입을 가지면 remquo 가 호출됩니다. 그 외의 경우에는 remquof 가 호출됩니다.

목차

매개변수

x, y - 부동 소수점 값
quo - 부호와 x / y 의 일부 비트를 저장하기 위한 정수 값 포인터

반환값

성공 시, remainder 에 정의된 대로 x / y 의 부동소수점 나머지를 반환하고, * quo 에는 x / y 의 부호와 최소 세 개의 최하위 비트를 저장합니다 (공식적으로는, 부호가 x / y 의 부호와 같고 크기가 2 n
모듈로 x / y 의 정수 몫의 크기와 합동인 값을 저장하며, 여기서 n 은 구현에서 정의된 3 이상의 정수입니다).

만약 y 가 0이면, * quo 에 저장되는 값은 지정되지 않습니다.

도메인 오류가 발생하면 구현에서 정의한 값이 반환됩니다(NaN을 지원하는 경우 해당 값).

언더플로로 인해 범위 오류가 발생하는 경우, 서브노멀을 지원하면 올바른 결과가 반환됩니다.

만약 y 가 0이지만 도메인 오류가 발생하지 않는 경우, 0이 반환됩니다.

오류 처리

오류는 math_errhandling 에 명시된 대로 보고됩니다.

y 가 0인 경우 도메인 오류가 발생할 수 있습니다.

구현이 IEEE 부동 소수점 연산(IEC 60559)을 지원하는 경우,

  • 현재 반올림 모드 는 영향을 미치지 않습니다.
  • FE_INEXACT 는 절대 발생하지 않습니다
  • 만약 x 가 ±∞이고 y 가 NaN이 아니면, NaN이 반환되고 FE_INVALID 가 발생합니다
  • 만약 y 가 ±0이고 x 가 NaN이 아니면, NaN이 반환되고 FE_INVALID 가 발생합니다
  • 만약 x 또는 y 가 NaN이면, NaN이 반환됩니다

참고 사항

POSIX는 x 가 무한대이거나 y 가 0인 경우 도메인 오류가 발생하도록 요구합니다.

이 함수는 주기가 부동 소수점 값으로 정확히 표현 가능한 주기 함수를 구현할 때 유용합니다: 매우 큰 x 에 대해 sin(πx) 를 계산할 때 sin 을 직접 호출하면 큰 오차가 발생할 수 있지만, 함수 인수를 먼저 remquo 로 환산하면, 몫의 하위 비트들을 사용하여 주기 내 결과의 부호와 팔분위를 결정하는 동시에 나머지를 사용하여 높은 정밀도로 값을 계산할 수 있습니다.

일부 플랫폼에서는 이 연산이 하드웨어에서 지원됩니다 (예를 들어, Intel CPU에서 FPREM1 은 몫에 정확히 3비트의 정밀도를 남깁니다).

예제

#include <fenv.h>
#include <math.h>
#include <stdio.h>
#ifndef __GNUC__
#pragma STDC FENV_ACCESS ON
#endif
double cos_pi_x_naive(double x)
{
    const double pi = acos(-1);
    return cos(pi * x);
}
// 주기는 2, 값은 (0;0.5) 양수, (0.5;1.5) 음수, (1.5,2) 양수
double cos_pi_x_smart(double x)
{
    const double pi = acos(-1);
    int extremum;
    double rem = remquo(x, 1, &extremum);
    extremum = (unsigned)extremum % 2; // 최근접 극점 결정을 위해 1비트 유지
    return extremum ? -cos(pi * rem) : cos(pi * rem);
}
int main(void)
{
    printf("cos(pi * 0.25) = %f\n", cos_pi_x_naive(0.25));
    printf("cos(pi * 1.25) = %f\n", cos_pi_x_naive(1.25));
    printf("cos(pi * 1000000000000.25) = %f\n", cos_pi_x_naive(1000000000000.25));
    printf("cos(pi * 1000000000001.25) = %f\n", cos_pi_x_naive(1000000000001.25));
    printf("cos(pi * 1000000000000.25) = %f\n", cos_pi_x_smart(1000000000000.25));
    printf("cos(pi * 1000000000001.25) = %f\n", cos_pi_x_smart(1000000000001.25));
    // 오류 처리
    feclearexcept(FE_ALL_EXCEPT);
    int quo;
    printf("remquo(+Inf, 1) = %.1f\n", remquo(INFINITY, 1, &quo));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID raised");
}

가능한 출력:

cos(pi * 0.25) = 0.707107
cos(pi * 1.25) = -0.707107
cos(pi * 1000000000000.25) = 0.707123
cos(pi * 1000000000001.25) = -0.707117
cos(pi * 1000000000000.25) = 0.707107
cos(pi * 1000000000001.25) = -0.707107 
remquo(+Inf, 1) = -nan
    FE_INVALID raised

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.12.10.3 remquo 함수들 (p: TBD)
  • 7.25 타입-제네릭 수학 <tgmath.h> (p: TBD)
  • F.10.7.3 remquo 함수들 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.12.10.3 remquo 함수들 (p: 186)
  • 7.25 타입-제네릭 수학 <tgmath.h> (p: 272-273)
  • F.10.7.3 remquo 함수들 (p: 385)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.12.10.3 remquo 함수들 (p: 255)
  • 7.25 타입-제네릭 수학 <tgmath.h> (p: 373-375)
  • F.10.7.3 remquo 함수들 (p: 529)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.12.10.3 remquo 함수들 (p: 236)
  • 7.22 타입-제네릭 수학 <tgmath.h> (p: 335-337)
  • F.9.7.3 remquo 함수들 (p: 465)

참고 항목

정수 나눗셈의 몫과 나머지를 계산함
(함수)
(C99) (C99)
부동소수점 나눗셈 연산의 나머지를 계산함
(함수)
부동소수점 나눗셈 연산의 부호 있는 나머지를 계산함
(함수)