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

运算符列表。(为了避免表格排版错误,| 替换成了 I。)

运算符功能样例
+ – * /四则运算1 + 2 * 3 / 4
**乘方3 ** 3.5
%取余5 % 3
++ —自增、自减i++(返回 i) ++i(返回 i + 1)
& I ^按位与、按位或、按位异或11 & 13
~按位取反~15
<< >>按位左移、按位右移1 << 3
< <= > >=大小比较2 <= 4
== !=相等比较2 != 4
&& II逻辑与、逻辑或2 <= 4 && 1 != 3 II 5 > 0
!逻辑非! 1 > 2
^^逻辑异或(两个中只有一个为真)1 > 0 ^^ 1 < 0
=赋值i = 10
+= -= = /= %= *= &= ^= I= <<= >>= &&= ^^= II=复合赋值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

参考

http://www.bash2zsh.com/zsh_r…

本文不再更新,全系列文章在此更新维护:github.com/goreliu/zshguide

付费解决 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等领域相关问题,灵活定价,欢迎咨询,微信 ly50247。

    原文作者:陌辞寒
    原文地址: https://segmentfault.com/a/1190000010924010
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞