Numeric Functions
삼각함수의 인수는 기본적으로 radian 값을 사용합니다.
sin ( x )
sine 값을 반환합니다. 인수 x 는 radian 값입니다.
$ awk 'BEGIN {
print sin(1)
print sin(2)
}'
0.841471
0.909297
.................
$ awk 'BEGIN {
print sin(degree2radian(30))
print sin(degree2radian(45))
print sin(degree2radian(90))
}
function degree2radian( x ) { return x * atan2(0, -1) / 180 }
'
0.5
0.707107
1
cos ( x )
cosine 값을 반환합니다. 인수 x 는 radian 값입니다.
$ awk 'BEGIN {
print cos(1)
print cos(2)
}'
0.540302
-0.416147
..................
$ awk 'BEGIN {
print cos(degree2radian(0))
print cos(degree2radian(60))
print cos(degree2radian(90))
print "--------------------"
printf "%.2f\n", cos(degree2radian(0))
printf "%.2f\n", cos(degree2radian(60))
printf "%.2f\n", cos(degree2radian(90))
print "--------------------"
OFMT="%.2f"
print cos(degree2radian(0))
print cos(degree2radian(60))
print cos(degree2radian(90))
}
function degree2radian( x ) { return x * atan2(0, -1) / 180 }
'
1
0.5
6.12323e-17
--------------------
1.00
0.50
0.00
--------------------
1
0.50
0.00
atan2 ( y, x )
arctangent of y / x
해당하는 값을 반환합니다.
y, x 는 radian 값이고 atan2(0, -1)
로 pi 값을 구할 수 있습니다.
$ awk 'BEGIN { print atan2(0, -1); print 4 * atan2(1, 1) }'
3.14159
3.14159
$ awk 'BEGIN {
pi = atan2(0, -1)
print radian2degree( pi )
}
function radian2degree( x ) { return 180 * x / atan2(0, -1) }
'
180
$ awk 'BEGIN {
print radian2degree( atan2(2, 2) )
print radian2degree( atan2(10, -10) )
}
function radian2degree( x ) { return 180 * x / atan2(0, -1) }
'
45
135
............................................................
$ awk 'BEGIN {
print radian2degree(1)
print degree2radian(radian2degree(1))
}
function radian2degree( x ) { return 180 * x / atan2(0, -1) }
function degree2radian( x ) { return x * atan2(0, -1) / 180 }
'
57.2958
1
sqrt ( x )
제곱근 값을 반환합니다.
Return the positive square root of x. gawk prints a warning message if x is negative. Thus, sqrt(4) is 2.
$ awk 'BEGIN{
print sqrt(16);
print sqrt(0);
print sqrt(-4);
}'
4
0
awk: cmd. line:4: warning: sqrt: called with negative argument -4
-nan # not a number
exp ( x )
e 의 x 승( e^x
) 에 해당하는 값을 반환합니다.
Return the exponential of x ( e^x
) or report an error if x is out of range. The range of values x can have depends on your machine’s floating-point representation.
$ awk 'BEGIN{
print exp(1)
print exp(2)
print exp(-2)
print exp(0)
print exp(1234)
}'
2.71828 <--- e
7.38906
0.135335
1
awk: cmd. line:6: warning: exp: argument 1234 is out of range
+inf
# -M (--bignum) 옵션을 사용
$ awk -M 'BEGIN {
print exp(1234)
}'
8305975937361794218370004303501613924062084376337381006382190914.....
log ( x )
자연로그 값을 반환합니다.
Return the natural logarithm of x, if x is positive; otherwise, return NaN (“not a number”) on IEEE 754 systems. Additionally, gawk prints a warning message when x is negative.
$ awk 'BEGIN{
print log(1)
print log(exp(1)) # log(e)
print log(0)
print log(12)
print log(-1)
}'
0
1
-inf # infinity
2.48491
awk: cmd. line:6: warning: log: received negative argument -1
-nan
..............................................................
# 상용로그 (common logarithm)
$ awk 'BEGIN{
print log10(1)
print log10(10)
print log10(11)
}
function log10( x ) { return log(x) / log(10) }
'
0
1
1.04139
int ( x )
정수 부분만 반환합니다.
$ awk 'BEGIN{
print int(3.834), int(4.01), int(-5.923), int(-6.3)
}'
3 4 -5 -6
다음은 int 함수를 이용해 %
연산자와 같은 기능의 remainder 함수를 만들고,
remainder 함수를 이용해 modulus 함수를 만드는 예입니다.
$ awk 'BEGIN { print -21 % 4 }'
-1
$ awk 'BEGIN { print rem(-21, 4) }
function rem(n, d) { return n - d * int(n / d) }
'
-1
$ awk 'BEGIN { print mod(-21, 4) }
function rem(n, d) { return n - d * int(n / d) }
function mod(n, d) { return rem(d + rem(n, d), d) }
'
3
--------------------------------------------------
$ awk 'BEGIN {
calc("rem", 10, 4)
calc("mod", 10, 4)
print gensub(/ /, "-", "g", sprintf("%85s", ""))
calc("rem", 10, -4)
calc("mod", 10, -4)
}
function calc(fun, n, d) {
print fun " " d
for (i=-n; i<=n; i++) printf "%4d", i; print
for (i=-n; i<=n; i++) printf "%4d", @fun(i,d); print
}
function rem(n, d) { return n - d * int(n / d) }
function mod(n, d) { return rem(d + rem(n, d), d) }
'
rem 4
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10
-2 -1 0 -3 -2 -1 0 -3 -2 -1 0 1 2 3 0 1 2 3 0 1 2
mod 4
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10
2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2
-------------------------------------------------------------------------------------
rem -4
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10
-2 -1 0 -3 -2 -1 0 -3 -2 -1 0 1 2 3 0 1 2 3 0 1 2
mod -4
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10
-2 -1 0 -3 -2 -1 0 -3 -2 -1 0 -3 -2 -1 0 -3 -2 -1 0 -3 -2
rand ( )
srand ( [ x ] )
rand, srand 함수는 같이 설명합니다. rand 함수는 기본적으로 0 과 1 사이의 random 값을 반환합니다.
$ awk 'BEGIN { for (i=0; i<5; i++) print rand() }' |
xargs -n10 | column -t
0.237788 0.291066 0.845814 0.152208 0.585537
그러므로 0 에서 99 사이의 random 값을 구하려면 다음과 같이 해야 합니다.
$ awk 'BEGIN { for (i=0; i<10; i++) print int(rand()*100) }' |
xargs -n10 | column -t
23 29 84 15 58 19 81 17 48 15
rand() 함수는 기본적으로 awk 가 실행될 때마다 같은 random 값을 출력합니다.
$ awk 'BEGIN { for (i=0; i<10; i++) print int(rand()*100) }' |
xargs -n10 | column -t
23 29 84 15 58 19 81 17 48 15
$ awk 'BEGIN { for (i=0; i<10; i++) print int(rand()*100) }' |
xargs -n10 | column -t
23 29 84 15 58 19 81 17 48 15 <---- 위와 같은 값
awk 가 실행될 때마다 다른 random 값을 출력하려면 srand() 함수를 이용하여 새로운 seed 값을 설정해야 합니다.
# seed 값을 1 로 설정
$ awk 'BEGIN { srand(1); for (i=0; i<10; i++) print int(rand()*100) }' |
xargs -n10 | column -t
23 29 84 15 58 19 81 17 48 15
$ awk 'BEGIN { srand(1); for (i=0; i<10; i++) print int(rand()*100) }' |
xargs -n10 | column -t
23 29 84 15 58 19 81 17 48 15 <---- 위와 같은 값
.......................................................................
# seed 값을 2 로 설정
$ awk 'BEGIN { srand(2); for (i=0; i<10; i++) print int(rand()*100) }' |
xargs -n10 | column -t
61 66 87 5 34 76 2 67 29 95
$ awk 'BEGIN { srand(2); for (i=0; i<10; i++) print int(rand()*100) }' |
xargs -n10 | column -t
61 66 87 5 34 76 2 67 29 95 <---- 위와 같은 값
........................................................................
# seed 값을 따로 설정하지 않음
$ awk 'BEGIN { srand(); for (i=0; i<10; i++) print int(rand()*100) }' |
xargs -n10 | column -t
92 91 67 73 59 23 65 60 51 19
$ awk 'BEGIN { srand(); for (i=0; i<10; i++) print int(rand()*100) }' |
xargs -n10 | column -t
84 86 51 24 14 50 47 46 5 1 <---- 위와 다른 값
$ awk 'BEGIN { srand(); for (i=0; i<10; i++) print int(rand()*100) }' |
xargs -n10 | column -t
3 35 68 43 94 40 13 98 23 70 <---- 위와 다른 값