remquo, remquof, remquol
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더에 정의됨
<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부터) |
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)
(C99)
|
부동소수점 나눗셈 연산의 나머지를 계산함
(함수) |
|
(C99)
(C99)
(C99)
|
부동소수점 나눗셈 연산의 부호 있는 나머지를 계산함
(함수) |
|
C++ documentation
for
remquo
|
|