[C++] pow 함수를 사용할 때 주의할 점

ᴄsᴇ ᴘᴇʙʙʟᴇ·2022년 4월 3일
0

C++ 공부노트

목록 보기
1/2
post-thumbnail

💻 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;
}

👉 오류 메세지

powreturn 값이 정수형처럼 보여도, 실제로는 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형으로 강제 형 변환을 해준 후에 하자!

profile
ꜱɪɴᴄᴇ 2021.09.01

0개의 댓글