티스토리 뷰

C | C++

삼각 함수

야라바 2018. 6. 29. 11:11
728x90

☞ sin, cos, tan, asin, acos, atan, atan2

<math.h>

double sin(double x);
float sinf(float x);
long double sinl(long double x);
double cos(double x);
float cosf(float x);
long double cosl(long double x);
double tan(double x);
float tanf(float x);
long double tanl(long double x);
double asin(double x);
float asinf(float x);
long double asinl(long double x);
double acos(double x);
float acosf(float x);
long double acosl(long double x);
double atan(double x);
float atanf(float x);
long double atanl(long double x);
double atan2(double y, double x);
float atan2f(float y, float x);
long double atan2l(long double y, long double x);

부동 소수점수를 표현하는 C언어의 타입으로는 float, double, long double 등이 있는데 기본적인 삼각 함수들(sin, cos, tan, asin, acos, atan, atan2)은 double 타입을 사용합니다. 기본적인 삼각 함수에 더해서 float 타입은 접미어로 -f를 붙인 함수를, long double 타입은 접미어로 -l을 붙인 함수를 사용합니다. CPU 및 운영체제에 따라 다르지만 float < double < long double 순으로 데이터 타입 표현에 더 많은 메모리를 사용하므로 정밀도는 높아지는 대신 연산 속도가 떨어지는 단점이 있습니다. 용도에 맞는 부동 소수점 타입과 삼각 함수를 선택하는 것이 좋습니다.

사인, 코사인, 탄젠트(sin, cos, tan) 함수 호출에 필요한 인수의 값은 라디안(radians) 형태로 전달해야 합니다. 보통 M_PI로 정의되어 있는 파이(3.14159265358979323846264338327) * 라디안은 180도입니다. 라디안은 57.2957 정도입니다. sin, cos는 -1 ~ 1 사이의 값을 리턴합니다.

asin, acos, atan, atan2 함수들은 sin(), cos(), tan() 함수의 반대로 예를 들어 asin(x)는 sin(r) 값이 x인 라디안 r을 리턴합니다. atan2()은 인수로 넘기는 y/x의 atan() 값을 리턴합니다.



☞ 예제1

static double geo_distance_internal(Point *pt1, Point *pt2)
{
	double		long1,
				lat1,
				long2,
				lat2;
	double		longdiff;
	double		sino;

	/* convert degrees to radians */
	long1 = degtorad(pt1->x);
	lat1 = degtorad(pt1->y);

	long2 = degtorad(pt2->x);
	lat2 = degtorad(pt2->y);

	/* compute difference in longitudes - want < 180 degrees */
	longdiff = fabs(long1 - long2);
	if (longdiff > M_PI)
		longdiff = TWO_PI - longdiff;

	sino = sqrt(sin(fabs(lat1 - lat2) / 2.) * sin(fabs(lat1 - lat2) / 2.) +
				cos(lat1) * cos(lat2) * sin(longdiff / 2.) * sin(longdiff / 2.));
	if (sino > 1.)
		sino = 1.;

	return 2. * EARTH_RADIUS * asin(sino);
}

위의 코드는 PostgreSQL DBMS의 코드 일부로 삼각 함수를 호출하기 이전에 각도를 라디안으로 변환하는 과정과 두 지점의 위도 및 경도를 받아 마일 단위의 두 지점간 거리를 리턴 하는 과정을 참조할 수 있습니다.




728x90

'C | C++' 카테고리의 다른 글

난수 함수  (0) 2018.06.29
지수와 로그 함수  (0) 2018.06.29
시스템 로그  (0) 2018.06.29
터미널 IO  (0) 2018.06.29
데이터 그램 소켓 사용하기  (0) 2018.06.17