역삼각함수란 삼각함수의 역함수를 의미하고,
역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.
수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데, ErLang 언어에서는 asin 함수로 구현되어 있다.
OCaml 언어는 F#, Scala 언어 처럼 비순수 함수형 언어이다. (여기서 바순수라 함은 절차적 언어 처럼 for, while, break 등의 제어문 기능을 갖고 있어서 C 언어나 Java 언어 처럼 작성할 수 있다는 뜻이다.)
OCaml 언어로 작성된 소스에서는 각 명령 줄이 두 개의 세미콜론(;;)으로 끝나야 한다.
영문 위키피디아의 OCaml 프로그래밍 언어 설명: http://en.wikipedia.org/wiki/OCaml
OCaml 언어로 부동소수점수(float 타입, 이느 C 언어와 Java 언어의 double 타입에 해당)의 사칙 연산 기로가 +, -, *, / 가 아니라 각 연산지 뒤에 점(.)을 하나씩 추가한 +., -., *., /. 임에 주위 한다. 정수(int) 타입의 사칙 연산 기호는 +, -, *, / 를 그대로 사용한다. 그리고 float 타입과 int 타입을 섞어서 연산할 때는 반드시 타입을 통일시키는 작업을 해야 한다.
아래에서 샤프 기호(#)는 OCaml 의 프롬프트이다. 테스트는 진한 글자로 된 부분만 입력하면 된다.
명령프롬프트> ocaml
Objective Caml version 3.12.1
# 3 + 1.2;;
Characters 4-7:
3 + 1.2;;
^^^
Error: This expression has type float but an expression was expected of type
int
# (float_of_int 3) + 1.2;;
Characters 0-16:
(float_of_int 3) + 1.2;;
^^^^^^^^^^^^^^^^
Error: This expression has type float but an expression was expected of type
int
# (float_of_int 3) +. 1.2;;
- : float = 4.2
# 3 + (int_of_float 1.2);;
- : int = 4
아래의 소스는 컴파일 없이 "ocaml 소스파일명" 으로 실행해도 되고, "ocamlc -o 실행파일명 소스파일명" 컴파일한 뒤 생성된 실행파일을 실행해도 된다.
컴파일하여 실행하는 경우 현재 최신 버전인 OCaml 4.00.1 은 "NTVDM CPU CS ......" 에러가 발생힌디.
OCaml 3.12.* 에서는 컴파일 하여 실행하더러도 아무 문제가 없다.
(윈도우 Vista, XP, 7 등에서 OCaml 3.12.1 은 설치되는 중에 시스템 환경변수 PATH 의 값을 삭제해 버리므로 주의를 요한다. PATH 의 값을 다른 곳에 저장해 두었다가 복원해야 함.)
(*
Filename: testArcSine.ml
Execute: ocaml testArcSine.ml
Or
Compile: ocamlc -o testArcSine testArcSine.ml
Execute: ./testArcSine
Or
Compile: ocamlc -o testArcSine.exe testArcSine.ml
Execute: testArcSine.exe
Date: 2013. 1. 3.
Copyright (c) pkim _AT_ scripts.pe.kr
*)
let asinh x = log(x +. sqrt(x *. x +. 1.0));;
let acosh x = log(x +. sqrt(x *. x -. 1.0));;
let x = -0.9;;
let y = asin(x);;
let _ = Printf.printf "y = asin(%g) = %.9f\n" x y;;
let _ = Printf.printf "sin(y) = sin(%.9f) = %g\n" y (sin y) ;;
let _ = Printf.printf "\n";;
let x = 1.1;;
let u = acosh(x);;
let _ = Printf.printf "u = acosh(%g) = %.10f\n" x u;;
let v = asinh(x);;
let _ = Printf.printf "v = asinh(%g) = %.10f\n" x v;;
let _ = Printf.printf "cosh(u) = cosh(%.10f) = %g\n" u (cosh u);;
let _ = Printf.printf "sinh(v) = sinh(%.10f) = %g\n" v (sinh v);;
(*
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
*)