[C++] pow 함수를 사용할 때 주의할 점
💻 pow 함수의 인자와 return 값의 자료형을 알아보자
✏️ 인자의 자료형
<cmath>
헤더의 pow
함수는 기본적으로 double
형 인자를 받는다.
하지만 pow
함수는 계산을 하기 전에 인자값이 무엇이 오든 double
형으로 casting
한 후에 계산을 해주기 때문에, 정수형 등 double
형이 아닌 자료형을 인자값으로 넣어주어도 상관이 없다.
✏️ return 값의 자료형
위에서 말했듯 계산은 결국 double
형끼리만 연산하게 되기 때문에, return
값 또한 double
형이 된다.
✏️ 참고
기본적으로 double
형인 것이지, float
형이나 long double
으로도 가능하니 자세한 것은 공식문서를 참고하자.
💻 분명히 return 값이 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
표준 출력 함수의 특성 때문이다.
✏️ 표준 출력 함수 cout의 특징
std::cout
은 기본적으로 소수점 부분이 0이면 이를 출력하지 않는다!!
그렇기 때문에 위의 예시에서 pow
함수의 결과가 소수점 없이 딱 떨어지는 4.0이었기 때문에 4.0이 아니라 4만 출력한 것이다.
사실 출력된 4도 double
형이 맞는데, 소수점 부분이 생략되었기 때문에 정수형처럼 보이는 것이다.
이러한 cout
의 특징을 모르고 있었다면, pow
함수의 return
형이 정수형이라고 착각할 수 있다. 정수형처럼 보여도 pow
함수의 return
형은 double
형임을 기억하자!
💻 pow 함수의 결과값을 연산에 사용할 때 주의할 점
✏️ 주의할 점
다시 한번 떠올려보자. 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 함수의 결과값에 % 연산자(나머지 연산자)를 수행하려면 어떻게 해야할까?
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
형으로 강제 형 변환을 해준 후에 하자!
Author And Source
이 문제에 관하여([C++] pow 함수를 사용할 때 주의할 점), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@cse_pebb/C-pow-함수저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)