深入剖析vscode工具函数(九)数字相关处理

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的工具函数中方便地使用,让我们能够更轻松地处理数字相关的任务。

相关推荐
C++、Java和Python的菜鸟1 小时前
第9章 后端Web进阶(AOP)
java·开发语言·前端
我星期八休息2 小时前
扩展— TCP 全连接队列与 tcpdump 抓包
linux·服务器·开发语言·前端·网络·tcp/ip·tcpdump
AC赳赳老秦3 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
结网的兔子3 小时前
【前端开发】Web端迁移至 uni-app 及鸿蒙扩展方案对比
前端·uni-app·harmonyos
黄泉路醉s3 小时前
在Vant+Vue+TypeScript的H移动前端使用UnoCSS
前端·vue.js·typescript
水瓶夜之3 小时前
.NET 中的新增功能系列文章——.NET SDK中的新增功能
前端·chrome·.net
笨笨狗吞噬者4 小时前
VS Code 内置浏览器打开网页
前端
SamChan904 小时前
WebSocket实现PDF翻译进度实时推送:Go后端+React前端的完整方案
前端·websocket·pdf·c#·react·机器翻译
甲维斯4 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·人工智能
奈斯先生Vector4 小时前
大模型 Agentic Workflow 架构解构:异构 API 调度与 Token 路由的多模态系统设计
开发语言·前端·架构·prompt·aigc·音视频