跳到主要内容

29、AWK 内置的数学函数

我一直以为 AWK 内置的算术运算函数会和 C 或 Java 或其它语言一样丰富,没想到,只是内置了几个常见的数学函数而已

反正切 atan2(y, x)

函数atan2(y, x) 以弧度为单位返回 (y/x) 的反正切值。

yx 两个参数请参考平面几何图形

           y
           ^
           |----------.(x,y)
           |           |
           |           |
-----------o-------------> x
           |
           |
           |

它的原型如下

atan2(y, x)

2 的意思是这个函数接受两个参数。

参数说明

参数 说明
y 某个点坐标中的 y 值
x 某个点坐标中的 x 值

范例

没啥好说的,平面几何知识忘的一干二净,直接看代码吧

[www.ddkk.com]$ awk 'BEGIN {
   PI = 3.14159265
   x = -10
   y = 10
   result = atan2 (y,x) * 180 / PI;

   printf "圆弧 (x=%f, y=%f) 的反正切值为 %f 度\n", x, y, result
}'

运行以上 awk 命令,输出结果如下

圆弧 (x=-10.000000, y=10.000000) 的反正切值为 135.000000 度

余弦值 cos(expr)

函数cos(expr) 以弧度为单位返回表达式 expr 的余弦值。

yx 两个参数请参考平面几何图形

           y
           ^
           |----------.(x,y)
           |           |
           |           |
-----------o-------------> x
           |
           |
           |

参数说明

参数 说明
expr 要求取余弦值的表达式

范例

没啥好说的,还是那句话: 平面几何知识忘的一干二净,直接看代码吧

[www.ddkk.com]$ awk 'BEGIN {
   PI = 3.14159265
   param = 60
   result = cos(param * PI / 180.0);

   printf "弧度 %f 的余弦值为 %f.\n", param, result
}'

运行以上 awk 命令,输出结果如下

弧度 60.000000 的余弦值为 0.500000.

e 为底的指数值 exp(expr)

exp 是高等数学里以自然常数 e 为底的指数函数,它同时又是 航模 名词,全称 Exponential(指数曲线)

在数学中,经常使用 y = ex 来表示

函数exp(expr) 用于求取以 e 为底的 expr 的指数值,也就是求 e[expr] 的值

它的原型为

exp(expr)

参数说明

参数 说明
expr 指数

范例

下面的代码,演示了如何使用 exp(expr) 函数求取 eexpr 的数学值

[www.ddkk.com]$ awk 'BEGIN {
   param = 5
   result = exp(param);

   printf "以 e 为底的 %f 指数值为 %f.\n", param, result
}'

运行以上 awk 命令,输出结果如下

以 e 为底的 5.000000 指数值为 148.413159.

转换为整数 int(expr)

函数int(expr) 用于把表达式 expr 的计算结果转换为整数。

它的原型如下

int(expr)

参数说明

参数 说明
expr 要转换为整数的表达式 expr

1、 如果expr的计算结果是整数,则直接返回;
2、 如果expr的计算结果是浮点数,则抛弃小数点;
3、 如果expr的计算结果是字符串,则尽可能的转换为数字;

范例 1

[www.ddkk.com]$ awk 'BEGIN {
   param = "5.12345"
   result = int(param)

   print "int(", param , ") 转换为整数为", result
}'

运行以上 awk 命令,输出结果如下

int( 5.12345 ) 转换为整数为 5

范例 2

[www.ddkk.com]$ awk 'BEGIN {
   param = "5.12345"
   result = int(param)

   print "int(", param , ") 转换为整数为", result
}'

运行以上 awk 命令,输出结果如下

int( 5.12345 ) 转换为整数为 5

范例 3

[www.ddkk.com]$ awk 'BEGIN {
   param = "542xxx"
   result = int(param)

   print "int(", param , ") 转换为整数为", result
}'

运行以上 awk 命令,输出结果如下

int( 542xxx ) 转换为整数为 542

以 e 为底的对数 / 自然对数 log(expr)

如果ax=N( a>0,且 a≠1 ), 那么数 x 叫做以 a 为底 N 的对数,记作 x=logaN,读作以 a 为底 N 的对数

其中a 叫做对数的底数,N 叫做真数。

通常我们将以 e 为底的对数叫自然对数,并把 logeN 记为 lnN

函数log(expr) 用于求取表达式 expr 的自然对数结果。

它的原型如下

log(expr)

范例

对数也忘的一干二净了,算了,直接看代码吧

[www.ddkk.com]$ awk 'BEGIN {
   param = 10
   result = log (param)

   printf "log(%f) = %f\n", param, result
}'

运行以上 awk 命令,输出结果如下

log(10.000000) = 2.302585

随机浮点数 rand()

函数rand() 用于返回一个 [0,1) 之间的随机浮点数 N。

左闭右开的 [0,1) 表示 N 的值满足 0 <= N< 1

它的函数原型如下

rand()

范例

没啥好说,直接看代码

[www.ddkk.com]$ awk 'BEGIN {
   print "Random num1 =" , rand()
   print "Random num2 =" , rand()
   print "Random num3 =" , rand()
}'

运行以上 awk 命令,输出结果如下

Random num1 = 0.840188
Random num2 = 0.394383
Random num3 = 0.783099

正弦值 sin(expr)

函数sin(expr) 以弧度为单位返回表达式 expr 的正弦值。

它的函数原型如下

sin(expr)

参数说明

参数 说明
expr 要求取正弦值的表达式

范例

哎,还是没啥好说的,悲剧啊,直接看代码

[www.ddkk.com]$ awk 'BEGIN {
   PI = 3.14159265
   param = 30.0
   result = sin(param * PI /180)

   printf "%f 的正弦值为 %f.\n", param, result
}'

运行以上 awk 命令,输出结果如下

30.000000 的正弦值为 0.500000.

sqrt(expr)

函数sqrt(expr) 用于求取表达式 expr 的开平方。也就是数学运算 √expr

它的函数原型如下

sqrt(expr)

参数说明

参数 说明
expr 要开平方的表达式

范例

哎,还是没啥好说的,悲剧啊,直接看代码

[www.ddkk.com]$ awk 'BEGIN {
   param = 1024.0
   result = sqrt(param)

   printf "sqrt(%f) = %f\n", param, result
}'

运行以上 awk 命令,输出结果如下

sqrt(1024.000000) = 32.000000

srand([expr])

srand([expr]) 函数使用使用一个种子值来生成一个随机数。

srand([expr]) 函数使用表达式 expr 的值作为种子来生成一个随机数。如果没有传递 expr ,则默认使用当前时间作为种子

需要注意的是,如果传递相同的种子 expr,那么该函数生成的随机数也是一样的。

[www.ddkk.com]$ awk 'BEGIN {
   param = 10

   printf "srand() = %d\n", srand()
   printf "srand(%d) = %d\n", param, srand(param)
}'

运行以上 awk 命令,输出结果如下

srand() = 0
srand(10) = 1558857510