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      <---- 위와 다른 값