역삼각함수란 삼각함수의 역함수를 의미하고,
역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.
수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데, D 언어에서는 asin 함수로 구현되어 있다. D 언어에서 지수함수, 로그함수, 삼각함수, 역삼각함수, 쌍곡선함수, 역쌍곡선함수 등을 이용하려면 import 구문
import std.math;
가 필요하다.
D 언어에 쌍곡선함수 sinh 와 cosh 의 역함수로 각각 asinh 와 acosh 가 이미 구현되어 있지만, 아래의 소스에서 arcsinh 와 arccosh 라는 이름의 함수로 자체 구현해 보았다.
삼각함수 sin, cos, tan 값은 cast(double) 로 캐스팅해서 (double 타입으로) 명시적인 타입변환해야 한다. 안 그러면 전혀 다른 값이 되어 버린다. (real 타입과의 충돌 때문에 이런 버그(?)가 있는 것 같은데, 이런 현상은 DMD 1.0 이든 DMD 2,0 이든 마찬가지이다.) 쌍곡선함수 sinh, cosh, tanh 값에는 이런 현상이 없다.
* Filename: testArcSine.d
*
* Cpmpile: dmd testArcSine.d
* Execute: ./testArcSine
*
* Date: 2013. 1. 4.
* Copyright (c) pkim _AT_ scripts.pe.kr
*/
import std.c.stdio; // printf 함수 사용을 위해
import std.stdio; // writeln 함수 사용을 위해
import std.math;
double arcsinh(double x) {
double y = log(x + sqrt(x*x + 1));
return y;
}
double arccosh(double x) {
double y = log(x + sqrt(x*x - 1));
return y;
}
int main (string[] args) {
double x, y, u, v;
x = -0.9;
y = asin(x);
printf("y = asin(%g) = %.9f\n", x, y);
printf("sin(y) = sin(%.9f) = %g\n", y, cast(double) sin(y));
writeln("");
x = 1.1;
u = acosh(x);
printf("u = acosh(%g) = %.10f\n", x, u);
v = asinh(x);
printf("v = asinh(%g) = %.10f\n", x, v);
printf("cosh(u) = cosh(%.10f) = %g\n", u, cosh(u));
printf("sinh(v) = sinh(%.10f) = %g\n", v, sinh(v));
writeln("");
printf("arccosh(%g) = %.10f\n", x, arccosh(x));
printf("arcsinh(%g) = %.10f\n", x, arcsinh(x));
return 0;
}
/*
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9
u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
arccosh(1.1) = 0.4435682544
arcsinh(1.1) = 0.9503469298
*/
'프로그래밍 > D' 카테고리의 다른 글
if ... else ... 조건문 사용 예제 for D (0) | 2008.03.08 |
---|---|
명령행 인자 처리 예제 for D (0) | 2008.03.08 |
for 반복문 예제 For D (0) | 2008.03.08 |
Hello 예제 for D (0) | 2008.03.08 |