Zsh 开发指南(七):数值计算
导读
数值计算并非 zsh 的强项,但应付一些简单的场景还是没问题的。并且 zsh 提供一个数值计算库,里边有一些比较常用的数学函数。
整数和浮点数类型
Zsh 中通常不用指定变量类型,但也可以指定。对数值计算来说,区分整数和浮点数是很重要的,不指定变量类型会带来不方便。
# 整数
% integer i=123
# (t) 用于输出变量类型
% echo ${(t)i}
integer
# 浮点数
% float f=123.456
% echo ${(t)f}
float
# 注意一旦指定了变量类型,类型就不会变了,除非再重新指定其他类型,或者用 unset 删除掉
# 如果把浮点数赋值给整数变量,会取整
% i=12.34
% echo $i
12
% a=-12.34
% echo $a
-12
# 整数是 64 位的带符号整数(在 32 位系统下也是)
% echo $((-2 ** 63)) $((2 ** 63 - 1))
-9223372036854775808 9223372036854775807
# 浮点数是 64 位带符号浮点数(在 32 位系统下也是)
% echo $((-1.79e-308)) $((1.79e308))
-1.79e-308 1.79e+308
运算符
数值计算主要是在 (( ))
或者 $(( ))
中进行的,在 $[ ]
或者 $var[ ]
(可用于数组索引的计算)中也能进行一部分,这里统一使用小括号。
% integer i=123
% float f=123.456
# $(( )) 会计算后返回数值
% echo $((i*f))
15185.088
# (( )) 用于判断数值比较的结果
% ((i < f && i + 1 > f)) && echo good
# 在 (( )) 中也可以给变量赋值
# (( )) 中的语法类似 c 语言,变量名前不需要 $,等号两边可以有空格
% float result
% ((result = i / f))
% echo $result
9.963063764e-01
运算符列表:
运算符 | 功能 | 样例 |
---|---|---|
+ - * / | 四则运算 | 1 + 2 * 3 / 4 |
** | 乘方 | 3 ** 3.5 |
% | 取余 | 5 % 3 |
++ -- | 自增、自减 | i++(返回 i) ++i(返回 i + 1) |
& | ^ | 按位与、按位或、按位异或 | 11 & 13 |
~ | 按位取反 | ~15 |
<< >> | 按位左移、按位右移 | 1 << 3 |
< <= > >= | 大小比较 | 2 <= 4 |
== != | 相等比较 | 2 != 4 |
&& || | 逻辑与、逻辑或 | 2 <= 4 && 1 != 3 || 5 > 0 |
! | 逻辑非 | ! 1 > 2 |
^^ | 逻辑异或(两个中只有一个为真) | 1 > 0 ^^ 1 < 0 |
= | 赋值 | i = 10 |
| 复合赋值 | i += 10 |
( ) | 调整优先级 | (1 + 2 ) * 3 |
? : | 三元运算符 | 1 > 2 ? 100 : 200 |
, | 逗号运算符(只返回后者) | 40, 20 == 20 |
运算符的优先级和其他编程语言的差不多,不列出了,如果不确定可以加小括号。这部分内容和 c、java、javascript 等语言基本一致。
数学函数
Zsh 包含了一个数学模块,如果需要使用数学函数,需要先加载 zsh/mathfunc
模块。
% zmodload -i zsh/mathfunc
% echo $((sin(0) + ceil(14.4)))
15.0
函数列表:
函数名 | 功能 |
---|---|
abs | 求绝对值 |
ceil | 向上取整 |
floor | 向下取整 |
int | 截断取整 |
float | 转换成浮点数 |
sqrt | 开平方 |
cbrt | 开立方 |
log | 自然对数 |
log10 | 常用对数 |
rand48 | 随机数 |
更多函数:
acos
、 acosh
、 asin
、 asinh
、 atan
、 atanh
、 cos
、 cosh
、 erf
、 erfc
、 exp
、 expm1
、 fabs
、 gamma
、 j0
、 j1
、 lgamma
、 log1p
、 logb
、 sin
、 sinh
、 tan
、 tanh
、 y0
、 y1
、 ilogb
、 signgam
、 copysign
、 fmod
、 hypot
、 nextafter
、 jn
、 yn
、 ldexp
、 scalb
参考
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论