Zsh 开发指南(七):数值计算

Linux中国
数值计算并非 zsh 的强项,但应付一些简单的场景还是没问题的。并且 zsh 提供一个数值计算库,里边有一些比较常用的数学函数。-- 陌辞寒
本文导航◈ 导读01%◈ 整数和浮点数类型03%◈ 运算符20%◈ 数学函数66%◈ 参考94%转载自 | http://www.jianshu.com/p/611dfc227018 作者 | 陌辞寒
导读
数值计算并非 zsh 的强项,但应付一些简单的场景还是没问题的。并且 zsh 提供一个数值计算库,里边有一些比较常用的数学函数。
[1]整数和浮点数类型
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
[2]运算符
数值计算主要是在 (( )) 或者 $(( )) 中进行的,在 $[ ] 或者 $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 等语言基本一致。
[3]数学函数
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
[4]参考
http://www.bash2zsh.com/zsh_refcard/refcard.pdf
举报成功