Julia Language

[Julia] 기초 문법 공부 - 산술 연산 관련 함수

공부하는백수 2021. 5. 11. 09:16

※ 다음 링크에서 줄리아 프로그래밍과 관련한 글 목록을 확인하실 수 있습니다.

Julia 프로그래밍 관련 글 목록

본 포스트는 이곳의 내용을 재정리하였음을 미리 알려 드립니다.


반올림/올림/내림/버림

함수 동작
round(x) x의 반올림
floor(x) x로부터 음의 무한대 방향으로 가장 가까운 정수 리턴
ceil(x) x로부터 양의 무한대 방향으로 가장 가까운 정수 리턴
trunc(x) x로부터 0의 방향으로 가장 가까운 정수 리턴
round(T, x), floor(T, x),
ceil(T, x), trunc(T,x)
출력 형태를 T로 지정 (ex, round(Int16, 2.1))

 


몫/나머지/Modulo/최대공약수/최소공배수

함수 동작
div(x, y) x/y의 몫 연산 ("x \div<tab> y"와 동일)
fld(x, y) floored division, 나눗셈 결과에서 음의 무한대 방향으로 가장 가까운 정수를 리턴
cld(x, y) ceilling division
rem(x, y) 나머지 연산
mod(x, y) modulo 연산
mod1(x, y) modulo with offset 1 (Julia가 1 based indexing이기 때문에 때때로 유용하지만 개인적으로 비추)
mod2pi(x) mod(x, 2pi)
divrem(x, y) div(x,y)와 rem(x, y)를 함께 리턴 (튜플로 반환, 하나의 튜플로 받아도 되고, 2개의 변수로 받아도 됨)
fldmod(x, y) fld(x,y)와 mod(x,y)를 함께 리턴
gcd(x, y, ...) 최대 공약수 구하기
lcm(x, y, ...) 최소 공배수 구하기

 


부호/절대값/제곱

함수 동작
abs(x) |x|
abs2(x) x^2 
sign(x) x의 부호 리턴, sign(0) = 0
singbit(x) sign bit가 1이면 true, 그렇지 않으면 false (결국 부호 판단)
copysign(x, y) 크기가 |x|이면서 부호는 sign(y)로 이루어진 값을 리턴
flipsign(x, y) 크기가 |x|이면서 부호는 sign(x*y)로 이루어진 값을 리턴

제곱근/지수함수/로그함수

함수 동작
sqrt(x) square root of x, x^1/2
cbrt(x) cube root of x, x^1/3
hypot(x, y) x^2 + y^2 = z^2을 만족하는 z 값 (피타고라스 정리)
exp(x) 지수 함수 
expm1(x) x가 0에 가까울 때, exp(x)-1의 정확한 값을 출력
ldexp(x, n) x * 2^n 값 계산, x는 Float, n은 integer type
log(x) 자연 로그 함수
log(b, x) 밑이 b인 로그 함수
log2(x) 밑이 2인 로그 함수
log10(x) 밑이 10인 로그 함수
log1p(x) x가 0에 가까울 때, log(1+x)의 정확한 값을 출력
exponent(x) binary exponent of x
significand(x) binary significand of a floating-point number x

삼각함수/쌍곡선함수

# Radian 기반 함수들
sin, cos, tan, asin, acos, atan,
cot, sec, csc, acot, asec, acsc,
sinh cosh tanh, asinh, acosh, atanh,
coth, sech, csch, acoth, asech, acsch,
sinc, cosc

# Degree 기반 함수들
sind, cosd, tand,
cotd, secd, cscd,
asind, acosd, atand,
acotd, asecd, acscd

  아마도 다른 프로그래밍 언어로 삼각함수를 다루어 본 경험이 있다면 위 함수들의 이름이 낯설지 않을 것이다. 만약, 위 함수명들이 익숙치 않다면 이곳을 참고하길 바란다. 위 함수들 중 atan(혹은 atand) 함수는 atan(y)와 atan(y, x)의 입력 형태를 모두 지원하며 -179~+180도 범위 내의 각도를 계산해준다. 따라서 Julia에서는 atan2 함수가 없다.

  위 함수 목록에서 sinc는 싱크함수를 의미하고 cosc 싱크함수의 미분으로 정의된다. \(sinc(x)\)와 \(cscs(x)\)의 정의는 다음과 같다.

 

$$sinc(x) = \frac{\sin(\pi x)}{\pi x}$$

 

$$cosc(x) = \frac{d}{dx}sinc(x)=\frac{\cos(\pi x)}{x} - \frac{\sin(\pi x)}{\pi x^2}$$

 

  다음은 Julia 프로그래밍을 이용하여 \(sinc(x)\)와 \(cosc(x)\)를 그리는 예제이다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
= Array(-10:0.2:10) .+ 0.00001
sinc_x_1 = sinpi.(x)./(pi*x)
sinc_x_2 = sinc.(x)
 
cosc_x_1 = cospi.(x)./- sinpi.(x)./(pi*x.^2)
cosc_x_2 = cosc.(x)
 
using Plots
 
## sinc(x)
plot(x,
    sinc_x_1,
    xlabel="x",
    ylabel="sinc(x)",
    linestyle=:solid,
    label="sin(pix)/pix")
 
plot!(x,
    sinc_x_2,
    seriestype = :scatter,
    label="sinc(x)")
 
 
## cosc(x)
plot(x,
    cosc_x_1,
    xlabel="x",
    ylabel="cosc(x)",
    seriestype = :line,
    linestyle=:solid,
    label="cos(pix)/x - sin(pix)/pix^2")
 
plot!(x,
    cosc_x_2,
    seriestype = :scatter,
    label="cosc(x)")
cs

  위 코드에서 plot함수 뒤에 느낌표(!)가 붙는 이유는 MATLAB에서의 hold on 기능을 사용한 것과 같은 효과를 내기 위함이다. 즉, 앞에서 그린 그림에 겹쳐 그리기 위함이다. 물론 기존의 GUI 객체에 그래프를 추가하는 방법은 다양하지만 여기서는 간단히 in-place function을 사용하였다. 위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있다.