<cmath>
헤더의 pow
함수는 기본적으로 double
형 인자를 받는다.
하지만 pow
함수는 계산을 하기 전에 인자값이 무엇이 오든 double
형으로 casting
한 후에 계산을 해주기 때문에, 정수형 등 double
형이 아닌 자료형을 인자값으로 넣어주어도 상관이 없다.
위에서 말했듯 계산은 결국 double
형끼리만 연산하게 되기 때문에, return
값 또한 double
형이 된다.
기본적으로 double
형인 것이지, float
형이나 long double
으로도 가능하니 자세한 것은 공식문서를 참고하자.
pow
함수의 return
값이 double
형이라고 했으니, 당연히 결과를 출력하면 소수가 출력되어야 한다.
❗ 그런데 소수가 아니라 정수로 출력되는 경우가 있다. 아래와 같은 경우이다.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
cout << "2.5의 2.5승은 " << pow(2.5,2.5) << "\n"; //1
cout << "2.0의 2.0승은 " << pow(2.0,2.0) << "\n"; //2
cout << "2의 2승은 " << pow(2,2) << "\n"; //3
return 0;
}
👉 결과
1번은 소수로 정상적으로 출력되었지만, 2번과 3번이 4.0이라는 소수가 아니라, 4라는 정수로 출력되었다! 뭔가 이상하다.
하지만 이것은 pow
함수가 이상한 것이 아니라, std::cout
표준 출력 함수의 특성 때문이다.
std::cout
은 기본적으로 소수점 부분이 0이면 이를 출력하지 않는다!!
그렇기 때문에 위의 예시에서 pow
함수의 결과가 소수점 없이 딱 떨어지는 4.0이었기 때문에 4.0이 아니라 4만 출력한 것이다.
사실 출력된 4도 double
형이 맞는데, 소수점 부분이 생략되었기 때문에 정수형처럼 보이는 것이다.
이러한 cout
의 특징을 모르고 있었다면, pow
함수의 return
형이 정수형이라고 착각할 수 있다. 정수형처럼 보여도 pow
함수의 return
형은 double
형임을 기억하자!
다시 한번 떠올려보자. pow
함수의 return
형은 double
형이다!
그렇기 때문에 pow
함수의 결과값을 가지고 연산을 수행할 때, 매우 주의해야 하는 연산자가 있다. 바로 % 연산자
(나머지 연산자)이다.
% 연산자
는 연산 인자에 double
형이 하나라도 포함되면 안된다. 즉, 정수형끼리만 연산을 할 수 있다.
그렇기 때문에 double
형인 pow
함수의 return
값에 % 연산자
를 사용하려고 하면, 에러가 발생한다.
앞서 살펴본 것처럼 pow
함수의 출력이 정수형처럼 보이게 될 경우, 아무 생각없이 해당 결과에 % 연산
을 하는 실수를 범할 수 있다.
아래의 예시를 보자.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
auto result = pow(2,2);
cout << "2의 2승은 " << result << "\n";
cout << "+ 연산자 : " << result << " + 3 = " << result + 3 << "\n";
cout << "- 연산자 : " << result << " - 3 = " << result - 3 << "\n";
cout << "* 연산자 : " << result << " * 3 = " << result * 3 << "\n";
cout << "/ 연산자 : " << result << " / 3 = " << result / 3 << "\n";
return 0;
}
% 연산자
를 제외한 다른 연산자들은 실수형 또한 연산이 가능하므로 정상적으로 출력이 된다.
그럼 이제 % 연산자
를 수행해보자.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
auto result = pow(2,2);
cout << "2의 2승은 " << result << "\n";
cout << "% 연산자 테스트 : " << result << " % 3 = " << result % 3;
return 0;
}
👉 오류 메세지
pow
의 return
값이 정수형처럼 보여도, 실제로는 double
형이기 때문에 % 연산
수행이 되지 않는다.
pow
함수의 return
값에 % 연산
을 수행해주려면, pow
함수의 return
값을 double
형에서 int
형으로 강제 형 변환을 해서 % 연산자
가 연산을 수행할 수 있는 자료형(정수 자료형)으로 만들어주어야 한다.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
auto result = (int)pow(2,2); // 강제 형 변환
cout << "% 연산을 써보자! >> " << result % 3;
return 0;
}
드디어 원하던 결과가 출력이 된다!
pow
함수의 인자의 자료형은 아무거나 상관없지만, return
값의 자료형은 double
형이라는 것을 꼭 기억하자!
double
형에 % 연산자
를 수행할 수 없으므로, pow
함수의 return
값에 % 연산자
를 수행하고 싶다면 int
형으로 강제 형 변환을 해준 후에 하자!