VSCode中的numbers模块
在VSCode的工具函数中,numbers
模块提供了一些方便处理数字的函数。其中包括clamp
函数,用于将一个数字限制在指定的范围内;rot
函数,用于对一个数字进行循环移位操作;以及计算移动平均值和滑动窗口平均值的函数等等。
clamp函数
clamp
是一个数学术语,表示将一个数值限制在指定的范围内。这个函数的实现非常简单:
typescript
export function clamp(value: number, min: number, max: number): number {
return Math.min(Math.max(value, min), max);
}
就是将value
限定在指定的范围内。虽然简单,但很实用。在vscode很多处理中,都需要考虑到边界问题,这个函数可以很好地预防数字超出边界到范围导致bug。
rot函数
rot
理论上应该代表的是旋转的含义,vscode实现这个函数,本质上是取模运算:
typescript
export function rot(index: number, modulo: number): number {
return (modulo + (index % modulo)) % modulo;
}
比如,调用了rot(5, 3)
,返回的是2
,因为5%3=2
。所谓旋转,可以想象是从数轴上把这个值翻转180,得到的结果。
这里为什么不直接返回index % modulo
呢?主要还要考虑负数的情况。比如rot(-1, 5)
,实际上返回的是4
,表示倒数第一个。
通过这个处理,我们就可以在循环结构中对下标进行安全的操作。
移动平均值
移动平均值是一个统计学中的概念,给定一个数列和一个固定子集大小,移动平均数的第一个元素是由数列的初始固定子集的平均值得到的。
在金融应用中,一个简单移动平均 (SMA )是以前 n 个数据的未加权平均数。
image
当计算下一天的移动平均的时候,就会在求和中加入一个新值,剔除一个旧值,无需把所有数值重新加一遍:
image
在VSCode中有一个类是用来计算移动平均值的:
kotlin
export class MovingAverage {
private _n = 1;
private _val = 0;
update(value: number): number {
this._val = this._val + (value - this._val) / this._n;
this._n += 1;
return this._val;
}
get value(): number {
return this._val;
}
}
在vscode的应用中,移动平均值经常被用来计算debounce延时、进度显示等策略上,让数值更加平滑。
滑动窗口平均值
滑动窗口平均值,顾名思义就是限定了一个固定尺寸的窗口,然后动态计算窗口内的平均值:
kotlin
export class SlidingWindowAverage {
private _n: number = 0;
private _val = 0;
private readonly _values: number[] = [];
private _index: number = 0;
private _sum = 0;
constructor(size: number) {
this._values = new Array(size);
this._values.fill(0, 0, size);
}
update(value: number): number {
const oldValue = this._values[this._index];
this._values[this._index] = value;
this._index = (this._index + 1) % this._values.length;
this._sum -= oldValue;
this._sum += value;
if (this._n < this._values.length) {
this._n += 1;
}
this._val = this._sum / this._n;
return this._val;
}
get value(): number {
return this._val;
}
}
这里要注意this._index = (this._index + 1) % this._values.length;
这行语句,实际上index指针是循环在走,类似循环队列,每次老的元素会被替换,然后sum减去老的,加上新的,重新计算平均值。比如,以输入5个数字为例:
image
index指针一直在这个窗口数组中循环游走。
小结
在numbers
模块中,vscode实现了一些简单的工具函数。比如,我们可以使用clamp
函数将一个数字限制在指定的范围内,使用rot
函数对一个数字进行循环移位操作,还可以使用MovingAverage
类和SlidingWindowAverage
类来计算移动平均值和滑动窗口平均值。这些函数和类都可以在VSCode的工具函数中方便地使用,让我们能够更轻松地处理数字相关的任务。