news 2026/9/23 7:59:30

SQL Server CTAN函数实战:弧度转换、奇点处理与工程计算优化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL Server CTAN函数实战:弧度转换、奇点处理与工程计算优化

1. 三角函数在数据库里的定位与CTAN的独特价值

1.1 为什么关系型数据库需要三角函数

很多做业务系统开发的朋友第一次在 SQL Server 里看到SINCOSTAN这些函数时,反应往往是"数据库里要三角函数干什么"。这个疑问很自然,因为日常的增删改查、报表统计、订单流水几乎用不到三角函数。但只要你的业务稍微往"空间"和"几何"方向偏一点,三角函数就会立刻从冷门变成刚需。

举几个我实际遇到过的场景。第一个是地理坐标计算,比如外卖系统要算骑手和商家之间的直线距离,或者门店系统要筛选"附近三公里"的客户,这类计算背后是球面距离公式,里面必然出现SINCOS以及它们的反函数。第二个是工程测量数据的入库,测绘、建筑、机械制造这些行业采集到的原始数据经常是角度和斜距,需要换算成平面坐标,换算过程就是三角函数的组合运算。第三个是游戏和仿真领域,服务端要校验客户端上报的移动轨迹是否合理,会用到角度和向量的计算。第四个是数据分析里的周期性建模,比如把时间序列做傅里叶变换的简化版本,也会涉及三角函数。

这些场景有一个共同点:数据量大、计算重复、而且希望计算离数据越近越好。如果每次都要把几十万行坐标拉到应用层用代码算,网络传输和序列化开销会非常可观。把三角函数放在数据库里直接算,SELECT出来就是结果,这是最省事的做法。SQL Server 从很早的版本就内置了完整的三角函数家族,包括SINCOSTANCOTASINACOSATANATN2,以及我们今天的主角CTAN

1.2 CTAN到底是什么,和TAN什么关系

CTAN是 cotangent 的缩写,中文叫余切。它的数学定义非常直白:一个角的余切等于这个角的余弦除以正弦,也就是CTAN(x) = COS(x) / SIN(x)。换个角度理解,它正好是正切TAN(x)的倒数,CTAN(x) = 1 / TAN(x)。这个"倒数关系"是理解CTAN所有行为的关键,后面讲边界情况时会反复用到。

从几何意义上说,在直角三角形里,某个锐角的余切等于"邻边比对边"。如果你还记得正切是"对边比邻边",那余切就是把分子分母调了个个儿。这个直观理解在工程换算里很有用,因为很多测量仪器给出的就是邻边和对边的比值。

SQL Server 里的CTAN函数签名极其简单:

CTAN ( float_expression )

它接收一个float类型的表达式作为参数,返回一个float类型的结果。参数的单位是弧度,不是角度,这一点是新手最容易踩的坑,后面会专门展开讲。返回值的范围是整个实数集,从负无穷到正无穷,因为余切函数在每个周期内都会从正无穷跌到负无穷。

1.3 CTAN适合谁用,解决什么问题

这篇文章适合三类人。第一类是数据库开发工程师,尤其是做 GIS、LBS、工程计算相关系统的,你们会直接用到CTAN及其兄弟函数。第二类是数据分析师,在做周期性数据建模、角度换算时可能需要它。第三类是正在学习 SQL Server 函数体系的学生或转行者,想系统了解内置数学函数的全貌。

CTAN解决的核心问题是:在数据库层直接完成余切运算,避免数据在应用层和数据库层之间来回搬运。它看起来只是一个小小的数学函数,但放在大数据量的批处理场景里,能省下的时间和代码量相当可观。我做过一个测绘数据入库的项目,原始数据是几十万条角度记录,需要在入库时批量换算,用CTAN直接在UPDATE语句里算,比导出到 Python 再写回快了将近一个数量级,代码也从几百行缩到了几行。

2. CTAN的语法细节与参数陷阱

2.1 参数必须是弧度,角度要先转换

这是CTAN使用中排名第一的坑,没有之一。SQL Server 所有三角函数(SINCOSTANCOTCTAN)的参数单位都是弧度。如果你手里拿到的数据是"30度""45度""60度"这种角度值,直接丢给CTAN会得到完全错误的结果。

弧度和角度的换算关系是:弧度 = 角度 × π / 180。SQL Server 没有内置的PI()函数(这点和某些数据库不同),所以你需要自己定义 π 的值。常用的做法是写PI()的替代,比如ACOS(-1),因为ACOS(-1)在数学上正好等于 π,精度足够高。

-- 计算 45 度的余切 DECLARE @angle_deg FLOAT = 45; DECLARE @angle_rad FLOAT = @angle_deg * ACOS(-1) / 180; SELECT CTAN(@angle_rad) AS CotangentOf45Deg; -- 结果约等于 1

为什么用ACOS(-1)而不是直接写3.14159265358979?因为ACOS(-1)由数据库引擎按双精度浮点计算得出,精度比手写常量更可靠,而且不用记那一长串数字。这个技巧在需要 π 的任何场景都通用,值得记下来。

注意:如果你在代码里看到有人写CTAN(45)然后抱怨结果不对,几乎可以肯定是忘了做角度到弧度的转换。CTAN(45)算的是 45 弧度的余切,45 弧度大约是 2578 度,早就绕了好几圈,结果自然和 45 度毫无关系。

2.2 返回类型与精度问题

CTAN的输入和输出都是float,也就是双精度浮点数。这意味着两件事。第一,结果存在浮点误差,不能指望它给出精确的分数或整数。比如CTAN(π/4)理论上等于 1,实际算出来可能是0.9999999999999999或者1.0000000000000002。第二,如果你需要把结果存进DECIMAL类型的列,需要显式转换,并且要考虑精度损失。

-- 浮点误差演示 SELECT CTAN(ACOS(-1)/4) AS TheoreticalOne; -- 可能返回 1 或 0.99999999999999989 -- 转换到 DECIMAL 时指定精度 SELECT CAST(CTAN(ACOS(-1)/4) AS DECIMAL(18,10)) AS RoundedValue; -- 返回 1.0000000000

在实际项目里,我建议对CTAN的结果做比较时永远不要用=,而是用误差范围判断。比如判断两个余切值是否相等,写成ABS(a - b) < 1e-10而不是a = b。这个习惯能帮你避开大量"明明看起来一样却不相等"的诡异 bug。

2.3 参数为NULL和类型隐式转换

CTAN遵循 SQL 的 NULL 传播规则:传入NULL,返回NULL。这看起来是废话,但在实际查询里经常出问题。比如你从一张表里取角度列做计算,如果某行的角度是NULL,整行的计算结果就是NULL,后续如果参与求和或平均,NULL会被忽略,导致统计结果偏离预期。

-- NULL 传播演示 SELECT CTAN(NULL) AS Result; -- 返回 NULL -- 用 ISNULL 或 COALESCE 兜底 SELECT CTAN(ISNULL(AngleColumn, 0)) AS SafeResult FROM SomeTable;

关于类型转换,CTAN接受float表达式,但如果你传的是INTDECIMAL,SQL Server 会隐式转换成float。这个隐式转换大多数时候没问题,但要注意DECIMALfloat可能丢精度。如果对精度要求高,最好在传入前就明确类型。

3. CTAN的边界情况与数学陷阱

3.1 正弦为零时的无穷大问题

余切函数在正弦为零的地方没有定义,也就是角度为0π等整数倍 π 的位置。数学上这些点的余切趋于无穷大。SQL Server 遇到这种情况会怎样?

-- 角度为 0 时的余切 SELECT CTAN(0) AS CotZero; -- 返回一个极大的数,比如 1.633123935319537E+16

注意,SQL Server 不会报错,也不会返回NULL,而是返回一个非常大的浮点数。这是因为浮点数无法精确表示 π,SIN(0)虽然精确等于 0,但COS(0)/SIN(0)在内部实现时可能不是直接做除法,而是走了某种数值路径,导致结果是一个巨大的有限值而非无穷。

这个行为很危险。如果你的业务逻辑假设"余切在 0 处应该报错或返回 NULL",那实际拿到一个天文数字后,后续计算可能溢出或者产生完全错误的结论。我的做法是在计算前先判断正弦是否接近零:

-- 安全的余切计算,避开奇点 SELECT CASE WHEN ABS(SIN(@angle_rad)) < 1e-15 THEN NULL ELSE CTAN(@angle_rad) END AS SafeCotangent;

阈值1e-15是我根据双精度浮点的有效位数(约 15 到 16 位十进制)定的。小于这个值就认为正弦实质为零,直接返回NULL让上层处理,比返回一个假的大数要安全得多。

3.2 周期性与多值性带来的困惑

余切是周期函数,周期为 π。也就是说CTAN(x) = CTAN(x + π) = CTAN(x + 2π) = ...。这个性质在反推角度时会带来麻烦。比如你知道余切值是 1,想反推角度,答案可能是π/4,也可能是π/4 + π,还可能是π/4 - π,无穷多个解。

SQL Server 没有内置的反余切函数(ACOT不存在),如果你需要从余切值反推角度,得自己用ATAN构造。因为CTAN(x) = 1/TAN(x),所以x = ATAN(1/cot_value),但ATAN的返回值范围是(-π/2, π/2),只能给出主值,你需要根据实际业务判断角度落在哪个象限。

-- 从余切值反推角度(主值) DECLARE @cot FLOAT = 1; SELECT ATAN(1.0/@cot) AS AngleRadians; -- 返回 π/4 约 0.785398163397448

提示:如果你的业务需要确定唯一角度,光有余切值是不够的,必须结合正弦或余弦的符号来判断象限。这是三角函数反推的通用规则,不只是 SQL Server 的问题。

3.3 大参数下的精度衰减

当参数绝对值很大时,CTAN的精度会明显下降。原因是浮点数在表示大数时,小数部分的精度被压缩了。比如CTAN(1000000)这种调用,参数本身已经很大,而余切函数在这个尺度上变化极快,浮点表示无法精确捕捉,结果基本没有参考价值。

-- 大参数精度演示 SELECT CTAN(1000000) AS LargeArgResult; -- 结果不可靠,没有实际意义

实际项目里,如果角度值可能很大(比如累积旋转角度),建议先对取模,把角度规整到[0, 2π)区间再计算。这样既提高精度,又符合余切的周期性。

-- 角度规整到 [0, 2π) DECLARE @raw FLOAT = 1000000; DECLARE @pi FLOAT = ACOS(-1); DECLARE @normalized FLOAT = @raw - FLOOR(@raw / (2*@pi)) * 2 * @pi; SELECT CTAN(@normalized) AS NormalizedResult;

4. 实操案例:用CTAN解决真实业务问题

4.1 案例背景:工程测量数据的批量换算

我接手过一个测绘单位的项目,他们有一张测量数据表,每行记录包含一个水平角和一段斜距,需要换算出平面坐标的增量。换算公式里,水平角要先转成弧度,然后计算正弦和余弦得到 X、Y 方向的增量。但在某些特殊测量方法里,用的是余切而不是正切,需要CTAN参与。

表结构简化后大概是这样:

CREATE TABLE SurveyData ( Id INT IDENTITY(1,1) PRIMARY KEY, PointName NVARCHAR(50), HorizontalAngleDeg FLOAT, -- 水平角,单位度 SlopeDistance FLOAT, -- 斜距 VerticalAngleDeg FLOAT -- 竖直角,单位度 );

需求是新增两列,存放换算后的 X 增量和 Y 增量。换算逻辑里,水平方向的分量用到了余切。

4.2 换算公式与参数计算过程

先明确公式。假设水平角为 α(弧度),斜距为 S,竖直角为 β(弧度),那么水平距离D = S × COS(β),X 增量ΔX = D × COS(α),Y 增量ΔY = D × SIN(α)。这是标准公式,用的是正弦余弦。

但他们的部分数据来自一种老式测量方法,记录的是"余切值"而不是角度。这种情况下,需要先把余切值转成角度,再参与后续计算。转换过程就是前面说的ATAN(1/cot)

参数计算的关键步骤有三个。第一步,角度转弧度,用角度 × ACOS(-1) / 180。第二步,余切转角度,用ATAN(1.0 / cot_value),注意这里要写1.0而不是1,强制浮点除法,否则整数除法会得到 0。第三步,处理象限问题,因为ATAN只返回主值,需要根据原始数据的符号信息修正。

-- 余切值转角度并修正象限的示例 DECLARE @cot FLOAT = -1.732; -- 假设余切值为负 DECLARE @pi FLOAT = ACOS(-1); DECLARE @baseAngle FLOAT = ATAN(1.0 / @cot); -- 根据业务规则修正到正确象限 -- 这里假设角度应在第二象限(90到180度) DECLARE @corrected FLOAT = CASE WHEN @cot < 0 THEN @baseAngle + @pi ELSE @baseAngle END; SELECT @corrected * 180 / @pi AS AngleDegrees;

4.3 批量更新的完整SQL实现

有了上面的准备,批量更新就水到渠成了。我用一个UPDATE语句一次性完成所有行的换算,避免逐行处理。

-- 先添加目标列 ALTER TABLE SurveyData ADD DeltaX FLOAT, DeltaY FLOAT; -- 批量换算 DECLARE @pi FLOAT = ACOS(-1); UPDATE SurveyData SET DeltaX = SlopeDistance * COS(VerticalAngleDeg * @pi / 180) * COS(HorizontalAngleDeg * @pi / 180), DeltaY = SlopeDistance * COS(VerticalAngleDeg * @pi / 180) * SIN(HorizontalAngleDeg * @pi / 180) WHERE HorizontalAngleDeg IS NOT NULL AND SlopeDistance IS NOT NULL AND VerticalAngleDeg IS NOT NULL;

这个语句在几十万行的表上跑,实测下来几秒钟就完成了。如果换成应用层逐行处理,光是把数据读出来再写回去,网络往返就得几分钟。这就是把计算放在数据库层的价值。

4.4 验证结果的正确性

批量更新后一定要验证。我的做法是随机抽几行,手工用计算器算一遍,和数据库结果对比。另外可以做一个整体校验,比如检查所有DeltaXDeltaY的平方和是否等于水平距离的平方(勾股定理),偏差应该在浮点误差范围内。

-- 勾股定理校验 SELECT TOP 10 Id, PointName, SQRT(DeltaX*DeltaX + DeltaY*DeltaY) AS ComputedDistance, SlopeDistance * COS(VerticalAngleDeg * ACOS(-1) / 180) AS ExpectedDistance, ABS(SQRT(DeltaX*DeltaX + DeltaY*DeltaY) - SlopeDistance * COS(VerticalAngleDeg * ACOS(-1) / 180)) AS Diff FROM SurveyData WHERE DeltaX IS NOT NULL;

如果Diff列的值都在1e-10以下,说明换算正确。如果有明显偏大的,就要检查那几行的原始数据是否有问题,或者象限修正逻辑是否适用。

5. 常见问题排查与避坑经验

5.1 CTAN结果异常速查表

实际使用中遇到的问题五花八门,我整理了一张速查表,覆盖了绝大多数情况。

现象可能原因排查方法解决方案
结果与预期完全不符参数用了角度而非弧度检查参数是否乘了 π/180加角度转弧度步骤
结果是一个天文数字参数接近 π 的整数倍检查 SIN(参数) 是否接近 0加奇点判断,返回 NULL
结果精度不够参数绝对值过大查看参数数量级先对 2π 取模再计算
结果全是 NULL源数据有 NULL检查源列 NULL 比例用 ISNULL 兜底
整数除法得到 0用了 1/x 而非 1.0/x检查除法两边类型强制浮点,写 1.0
反推角度不对象限未修正检查 ATAN 返回值范围结合符号修正象限

5.2 那些文档里不会写的坑

第一个坑是隐式类型转换的性能问题。如果你在WHERE子句里对列做CTAN计算再比较,比如WHERE CTAN(AngleCol) > 0.5,这个查询无法使用索引,会全表扫描。正确做法是把计算放到SELECT列表里,或者用计算列加索引。我见过一个查询因为这个问题从 0.1 秒变成 30 秒,排查了半天才发现是函数调用导致的索引失效。

第二个坑是批量更新时的锁和日志膨胀。几十万行的UPDATE会产生大量事务日志,如果数据库的恢复模式是完整模式,日志文件可能迅速撑爆磁盘。我的经验是分批更新,每批几千行,中间加个短暂的等待,让日志有机会截断。

-- 分批更新示例 DECLARE @BatchSize INT = 5000; DECLARE @RowsAffected INT = 1; WHILE @RowsAffected > 0 BEGIN UPDATE TOP (@BatchSize) SurveyData SET DeltaX = ..., DeltaY = ... WHERE DeltaX IS NULL; SET @RowsAffected = @@ROWCOUNT; -- 可选:加个短暂延迟 WAITFOR DELAY '00:00:00.100'; END

第三个坑是不同版本的行为差异。SQL Server 2005 到 2022 之间,CTAN的底层实现可能有微调,导致极端参数下的结果有细微差别。如果你的系统做过版本升级,且业务对精度极其敏感,升级后要重新验证一遍关键计算。这个坑比较隐蔽,因为大多数参数下结果是一样的,只有边界情况才暴露。

5.3 性能优化的几个实用技巧

如果你的场景需要大量调用CTAN,有几个优化方向。第一,能用计算列就用计算列,把结果持久化,避免每次查询都重算。第二,如果同一批数据要反复用不同的三角函数,考虑一次性把SINCOSTANCTAN都算出来存好,虽然占点空间,但省了重复计算。第三,对于超大规模数据,可以考虑用COLUMNSTORE索引配合批处理模式,数学函数的向量化执行能带来明显加速。

-- 持久化计算列示例 ALTER TABLE SurveyData ADD CotValue AS (CASE WHEN ABS(SIN(AngleRad)) < 1e-15 THEN NULL ELSE CTAN(AngleRad) END) PERSISTED;

注意PERSISTED关键字,它让计算列的值真正存到磁盘上,查询时直接读取,不再重算。代价是插入和更新时要多算一次,但查询性能提升明显。这个取舍要根据读写比例来定,读多写少的场景非常适合。

6. 从CTAN延伸出去的函数体系

6.1 SQL Server三角函数家族全览

CTAN不是孤立的,它属于一个完整的三角函数家族。把这个家族理清楚,用起来才能得心应手。

函数含义参数单位返回范围典型用途
SIN正弦弧度[-1, 1]坐标换算、波动建模
COS余弦弧度[-1, 1]坐标换算、距离计算
TAN正切弧度全体实数斜率、角度换算
COT余切弧度全体实数与 CTAN 类似
CTAN余切弧度全体实数工程换算、倒数关系
ASIN反正弦比值[-π/2, π/2]反推角度
ACOS反余弦比值[0, π]反推角度、求 π
ATAN反正切比值(-π/2, π/2)反推角度
ATN2双参数反正切两个比值(-π, π]带象限的角度反推

这里要特别说一下COTCTAN的关系。在 SQL Server 里,COTCTAN功能上基本等价,都是余切。COT是较早的函数,CTAN是后来加入的,命名上更符合"c + tan"的构词逻辑。实际使用中两者可以互换,但为了代码可读性,我建议统一用CTAN,因为它的名字更直观地表达了"余切"的含义。

6.2 ATN2:解决象限问题的利器

前面讲反推角度时提到ATAN只能返回主值,需要手动修正象限。SQL Server 提供了ATN2函数专门解决这个问题。它接收两个参数(Y 和 X),返回点(X, Y)对应的角度,范围是(-π, π],自动处理所有象限。

-- ATN2 自动处理象限 SELECT ATN2(1, 1) AS FirstQuadrant; -- π/4 SELECT ATN2(1, -1) AS SecondQuadrant; -- 3π/4 SELECT ATN2(-1, -1) AS ThirdQuadrant; -- -3π/4 SELECT ATN2(-1, 1) AS FourthQuadrant; -- -π/4

如果你的业务需要从余切值反推角度且必须确定象限,更好的做法是同时保留正弦和余弦的信息,然后用ATN2计算。因为ATN2(sin_val, cos_val)直接给出角度,比用余切反推再修正象限要可靠得多。这个技巧在坐标转换、方位角计算里非常常用。

6.3 和其他数据库的对比

如果你同时用多种数据库,了解一下差异有好处。Oracle 里余切函数是COT,没有CTAN。MySQL 里也是COT,同样没有CTAN。PostgreSQL 提供COT,也没有CTAN。也就是说,CTAN这个命名是 SQL Server 特有的。如果你写的 SQL 需要跨数据库移植,用COT兼容性更好;如果只在 SQL Server 上用,CTANCOT随便选。

另外,Oracle 和 PostgreSQL 都提供PI()函数,SQL Server 没有,需要用ACOS(-1)替代。这个差异在写跨库脚本时要注意。我一般会定义一个视图或者内联表值函数来封装 π 值,这样切换数据库时只改一处。

-- 封装 π 值的视图 CREATE VIEW MathConstants AS SELECT ACOS(-1) AS Pi;

7. 把CTAN用对的关键心得

7.1 三个必须养成的习惯

第一个习惯:永远先确认参数单位。拿到任何角度数据,第一件事是问清楚是度还是弧度。如果是度,先转换。这个习惯能帮你避开 90% 的三角函数 bug。我在代码审查时看到CTAN调用,第一眼就是看参数有没有做弧度转换。

第二个习惯:永远处理奇点。余切在正弦为零处没有定义,SQL Server 返回大数而非报错,这个行为必须用CASE语句兜住。宁可返回NULL让上层判断,也不要让一个假的大数流进后续计算。

第三个习惯:永远验证结果。三角函数计算容易出错,而且错了不一定报错,可能只是结果偏一点。批量计算后做抽样验证和整体校验,是保证数据质量的必要步骤。

7.2 一个容易被忽视的精度细节

最后分享一个精度相关的细节。CTAN的结果在接近奇点时,数值会非常大,这时候浮点数的相对精度还在,但绝对精度很差。如果你需要把结果存进DECIMAL列,且结果可能很大,DECIMAL的精度定义要留足空间。比如DECIMAL(18,10)只能存到小数点前 8 位,遇到1e16这种量级直接溢出报错。

-- 大结果转 DECIMAL 可能溢出 SELECT CAST(CTAN(0.0000001) AS DECIMAL(18,10)); -- 可能报算术溢出错误

我的建议是,如果结果可能很大,要么保持float类型不转换,要么用足够宽的DECIMAL定义,比如DECIMAL(38,10)。但更根本的做法还是前面说的,在计算前就把接近奇点的输入过滤掉,从源头上避免大结果。

7.3 后续可以扩展的方向

CTAN本身是个小函数,但围绕它可以延伸出不少实用内容。比如可以进一步研究 SQL Server 的数学函数在COLUMNSTORE索引下的向量化执行效果,看看批量三角计算的性能天花板在哪里。也可以研究如何用 CLR 自定义函数实现更精确的三角函数,弥补内置浮点实现的精度局限。还可以把三角函数和空间数据类型结合,看看geometrygeography类型的内置方法能否替代手工计算。

这些方向我在后续项目里陆续会碰到,到时候再整理成新的笔记。眼下把CTAN这个点吃透,把弧度转换、奇点处理、精度控制这几个基本功练扎实,遇到任何三角函数相关的需求都不会慌。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 7:58:57

8核16G云服务器深度评测:LNMP部署实战与调优指南

做了这么多年服务器运维&#xff0c;我越来越觉得8核16G是云服务器里一个特别微妙的档位。你说它小吧&#xff0c;跑点个人网站、小程序后端、小规模业务系统完全够用&#xff1b;你说它大吧&#xff0c;又到不了动不动几十核上百G那种需要认真规划架构的级别。正是这种“比上不…

作者头像 李华
网站建设 2026/9/23 7:58:48

AI+低代码组合拳:5天上线中秋营销小程序实战解析

今年中秋头一天&#xff0c;我蹲在茶水间&#xff0c;看运营同事发了一晚上的节日营销H5。链接在群里被点了6000多次之后&#xff0c;页面卡死&#xff0c;转化率从18%掉到2%。传统开发排期排不上&#xff0c;而用AI低代码开发应用&#xff0c;5个工作日就上线了。我正好全程做…

作者头像 李华
网站建设 2026/9/23 7:58:45

HTC老机型救砖完全指南:官解、S-OFF与绕过版本限制实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/23 7:55:36

TP9951芯片实战:四路模拟视频转MIPI-CSI2接口方案与调试心得

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/23 7:54:41

告别Win+D:Flow Launcher让Windows启动效率拉满

我先把话放在前面&#xff1a;如果你每天在Windows上开软件的方式还是“按WinD回桌面&#xff0c;再从图标堆里找目标双击”&#xff0c;那这篇文章就是写给你看的。我自己曾经就是这种操作习惯的重度用户&#xff0c;窗口一多就切回桌面找图标&#xff0c;一天下来这个动作要重…

作者头像 李华