역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 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
-}

 

 

Posted by Scripter
,