Haskell 언어로 역삼각함수, 역쌍곡선함수 값을 구하는 예제
역삼각함수란 삼각함수의 역함수를 의미하고,
역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.
수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데, Haskell 언어에서는 asin 함수로 구현되어 있다.
또한 Haskell 언어에서는 쌍곡선함수 sinh, cosh 의 역함수들이 각각 asinh, acosh 라는 이름으로 이미 구현되어 있다. 그래서 비교를 위해 아래의 소스에 arcsinh, arccosh 라는 이름의 함수로 구현해 보았다.
영문 위키피디아의 GHC 설명: http://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler
(참고. Haskell 언어는 대소 문자를 구분하며 타입에 엄격한 언어이다. )
아래의 소스는 Glasgow Haskell Compiler ghc 로 컴파일되는 소스이다.
Filename: testArcSine.hs
Compile: ghc testArcSine.hs
Execute: ./testArcSine
Date: 2013. 1. 3.
Copyright (c) pkim _AT_ scripts.pe.kr
-}
module Main where
import System.Environment
import Text.Printf
arcsinh :: (RealFloat a) => a -> a
arcsinh x = w where
w = log (x + sqrt (x*x + 1))
arccosh :: (RealFloat a) => a -> a
arccosh x = w where
w = log (x + sqrt (x*x - 1))
main :: IO ()
main = do
let x = -0.9 :: Double
let y = asin x
printf "y = asin(%f) = %.9f\n" x y
printf "sin(y) = sin(%.9f) = %f\n" y (sin y)
printf "\n"
let x =1.1 :: Double
let u = acosh x
printf "u = acosh(%.1f) = %.10f\n" x u
let v = asinh x
printf "v = asinh(%.1f) = %.10f\n" x v
printf "cosh(u) = cosh(%.10f) = %3.1g\n" u (cosh u)
printf "sinh(v) = sinh(%.10f) = %3.1g\n" v (sinh v)
printf "\n"
printf "arccosh(%.1f) = %.10f\n" x (arccosh x)
printf "arcsinh(%.1f) = %.10f\n" x (arcsinh x)
{-
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
-}