C언어 제곱 연산자는 없다?
C언어가 다른 언어에 비해 이상한 것이 한둘이 아닙니다만, 그중에 하나가 제곱 구하는 연산자입니다. 결론부터 말씀드리면 C언어에서는 제곱 구하는 연산자나 기호는 없습니다. 당연히 기호 ^ 이거 아냐 생각할 수 있지만, C언어에서 연산자 ^는 제곱을 구하는 것이 아니라 XOR 비트 연산자입니다. 그렇다면? pow() 계열의 함수를 사용해야 합니다.
다른 언어에서는 기호 한 번으로 쉽게 구할 수 있는 제곱을 왜 C언어에서는 함수를 사용해야 하나 의아하지만, 실제 코딩을 하다 보면 제곱을 구하는 것보다 XOR 연산을 더 자주 사용합니다. 혹시 이런 이유로 C언어는 제곱을 구하는 연산자를 포기(?)하고 함수를 사용하게 했는지 모르겠습니다.
C언어 제곱 함수 pow() 사용 주의사항
#include <math.h>
모든 C언어 코딩에서 그렇겠습니다만, 수학 함수를 사용한다면 반드시 math.h를 포함해야 합니다. 만일 생략하면 엉뚱한 값이 구해질 수 있습니다.
요즘 컴파일러는 친절해서 수학 함수를 사용할 경우 #include <math.h>를 사용하라고 알려주는군요. C언어를 처음 사용했을 때 경고·에러 없이 깨끗이(?) 컴파일되고 실행 파일이 만들어졌지만, 실행하면 값이 틀려서 무척 당황했습니다.
math.h 사용 시 -lm 옵션 추가
또한 math.h를 사용한다면 컴파일할 때 반드시 -lm을 사용합니다. 만일 사용하지 않으면 "undefined reference to `pow'
collect2: error: ld returned 1 exit status"라는 컴파일 에러가 발생합니다. 재미있게도 이 컴파일 에러가 없던 프로그램인데, 숫자를 변수로 바꾸었다고 발생하기도 합니다.
#include <stdio.h> #include <math.h> int main( void){ printf( "2 ^ 3 = %g\n", pow( 2.0, 3.0)); return 0; }
위 프로그램은 아무런 문제 없이 컴파일됩니다.
#include <stdio.h> #include <math.h> int main( void){ double temp = 3.0; printf( "2 ^ 3 = %g\n", pow( 2.0, temp)); return 0; }
이렇게 숫자를 변수로 바꾸기만 했는데 "undefined reference to `pow' collect2: error: ld returned 1 exit status" 컴파일 에러가 발생합니다.
같은 프로그램 소스임에도 -lm을 사용하면 컴파일 에러가 발생하지 않습니다.
'컴퓨터 > 프로그래밍' 카테고리의 다른 글
C언어 printf() 숫자가 inf로 나오는 이유는 (1) | 2022.06.11 |
---|---|
C언어 텍스트 파일 읽기 예제 (5) | 2022.05.30 |
C언어 텍스트 파일 읽기 예제 (0) | 2022.05.26 |