C 언어에서 두 개의 부동소수점(float 또는 double) 숫자에 대한 모듈로, 즉 나머지를 구하는 방법을 알아보겠습니다. 모듈로는 기본적으로 나눗셈의 나머지를 구하는 연산입니다. C에서는 math.h 헤더에 포함된 remainder() 함수를 사용하여 부동소수점 숫자의 나머지를 손쉽게 계산할 수 있습니다.
remainder() 함수는 분자를 분모로 나눈 부동소수점 나머지를 반환하며, 수식으로 표현하면 다음과 같습니다.
remainder(x, y) = x – rquote * y
여기서 rquote는 x/y의 값으로, 가장 가까운 정수로 반올림된 값입니다. 이 함수는 double, float, long double 타입의 인자 두 개를 받으며, 입력받은 인자와 동일한 타입의 나머지를 반환합니다. 첫 번째 인자는 분자(numerator), 두 번째 인자는 분모(denominator)입니다.
일반적인 fmod() 함수와 달리, remainder()는 몫을 0 방향이 아닌 가장 가까운 정수로 반올림하기 때문에 결과가 음수로 나올 수도 있다는 점에 유의해야 합니다.
예제 코드
#include <stdio.h>
#include <math.h>
main() {
double x = 14.5, y = 4.1;
double res = remainder(x, y);
printf("Remainder of %lf/%lf is: %lf\n",x,y, res);
x = -34.50;
y = 4.0;
res = remainder(x, y);
printf("Remainder of %lf/%lf is: %lf\n",x,y, res);
x = 65.23;
y = 0;
res = remainder(x, y);
printf("Remainder of %lf/%lf is: %lf\n",x,y, res);
}
실행 결과
Remainder of 14.500000/4.100000 is: -1.900000 Remainder of -34.500000/4.000000 is: 1.500000 Remainder of 65.230000/0.000000 is: -1.#IND00
결과 해석
첫 번째 경우, 14.5 ÷ 4.1 ≈ 3.54이고 몫을 가장 가까운 정수인 4로 반올림하므로 나머지는 14.5 − (4 × 4.1) = -1.9가 됩니다.
두 번째 경우, -34.5 ÷ 4.0 = -8.625이며 몫을 가장 가까운 정수인 -9로 반올림하므로 나머지는 -34.5 − (-9 × 4.0) = 1.5가 됩니다.
마지막 경우처럼 분모가 0이면 나눗셈 자체가 불가능하므로, 유효하지 않은 값(NaN)을 의미하는 -1.#IND00이 출력됩니다. 따라서 실제 코드에서는 분모가 0이 아닌지 먼저 확인하는 것이 안전합니다.