FreeBASIC 언어로 역삼각함수, 역쌍곡선함수 값을 구하는 예제
역삼각함수란 삼각함수의 역함수를 의미하고,
역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.
수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,
FreeBASIC 언어에서는 asin 함수로 구현되어 있다.
아래의 소스는 FreeBASIC 의 (명령줄 컴파일 명령) fbc 로 컴파일되는 소스이다.
참고 1. FreeBASIC 은 이전(MS-DOS 시절)에 쓰던 Quick BASIC 과 유사하며, Quick BASIC을 발전시킨 것이라고 보변 된다. 아래는 Wikipedia 에서 적어 놓은 FreeBASIC 의 설명이다.
---------------------------------------------------
FreeBASIC is a free/open source (GPL), 32-bit BASIC compiler[2] for Microsoft Windows, protected-mode DOS (DOS extender), Linux, FreeBSD and Xbox.
---------------------------------------------------
참고 2. Double 타입의 부동소수점수를 원하는 위치에서 적당히 반올림하여 출력하기 위해서는 Format 또는 Format$ 함수를 써야 하는데, 이를 위해서는 FreeBASIC 언어에서는 소스에
#include "string.bi"
를 추가해야 한다.
(참고로, FreeBASIC 언어에서는 Print Using 과 "#.#########" 포맷을 이용해서 Double 타입을 출력하면, 근사값이라는 의미로 수치 앞에 퍼센트 기호(%)가 붙는다.)
참고 3. 제곱근을 구하기 위해 C, Java, Ruby, Python 언어에서는 sqrt 함수를 사용하고, Visual BASIC, C# 언어에서는 Sqrt 함수를 사용하지만, FreeVASIC 언어에서는 Quick BASIC 언어에서 처럼 Sqr 로 구현되어 있다. (Sqrt 가 아니라 마지막 분자 t 가 빠진 Sqr 임에 주의한다.)
참고 4. FreeBASIC 언어에는 쌍곡선 함수가 구현되어 있지 않아 아래의 소스에 FreeBASIC 지수함수 Exp 를 이용하여 쌍곡ㅅ선 함수 sinh 함수와 cosh 함수를 구현헤 놓았다.
REM =============================================================
REM Filename: testArcSine.bas
REM
REM This source should be compiled by using FreeBASIC,
REM which can be downloaded from http://www.freebasic.net
REM
REM Compile: fbc testArcSine.bas
REM Execute: testArcSine
REM
REM Date: 2013. 1. 2.
REM Copyright (c) pkim _AT_ scripts.pe.kr
REM =============================================================
#include "string.bi"
Function asinh(x As Double) As Double
Dim y As Double = log(x + Sqr(x*x + 1))
return y
End Function
Function cosh(x As Double) As Double
Dim y As Double = (Exp(x) + Exp(-x))/2.0
return y
End Function
Function sinh(x As Double) As Double
Dim y As Double = (Exp(x) - Exp(-x))/2.0
return y
End Function
Function acosh(x As Double) As Double
Dim y As Double = log(x + Sqr(x*x - 1))
return y
End Function
Sub Main()
Dim x As Double = -0.9
Dim y As Double = asin(x)
' Print Using "y = asin(" & x & ") = #"; y
' Print Using "y = asin(" & x & ") = #.#########"; y
Print "y = asin(" & x & ") = "& Format$(y, "0.#########")
' Print "sin(y) = sin(" & y & ") = " & sin(y)
' Print Using "sin(y) = sin(#.########) = #"; y, sin(y)
Print "sin(y) = sin(" & Format$(y, "0.#########") & ") = " & sin(y)
Print
x = 1.1
Dim u As Double = acosh(x)
' Print "u = acosh(" & x & ") = " & u
Print "u = acosh(" & x & ") = " & Format$(u, "0.#########")
Dim v As Double = asinh(x)
' Print "v = asinh(" & x & ") = " & v
Print "v = asinh(" & x & ") = " & Format$(v, "0.##########")
' Print "cosh(u) = cosh(" & u & ") = " & Cosh(u)
' Print "sinh(v) = sinh(" & v & ") = " & Sinh(v)
Print "cosh(u) = cosh(" & Format$(u, "0.#########") & ") = " & Cosh(u)
Print "sinh(v) = sinh(" & Format$(v, "0.#########") & ") = " & Sinh(v)
' Print Format$(1.23, "#.#")
End Sub
Main()
' ---------------------------
' 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
' ---------------------------