본문으로 바로가기
homeimage
  1. Home
  2. 컴퓨터/프로그래밍
  3. C언어 제곱 연산자, 기호는?

C언어 제곱 연산자, 기호는?

· 댓글개 · 바다야크

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" 컴파일 에러가 발생합니다.

undefined reference to `pow&#39;
undefined reference to `pow'

같은 프로그램 소스임에도 -lm을 사용하면 컴파일 에러가 발생하지 않습니다.

SNS 공유하기
💬 댓글 개
최근글
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.