StarRocks 数学函数 SIN 详解:语法、返回值与向量化实现原理
2026/9/19 3:58:43 网站建设 项目流程

StarRocks 数学函数 SIN 详解:语法、返回值与向量化实现原理

【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks

本篇技术指南围绕 StarRocks 内置数学函数SIN展开,说明其在 SQL 查询中计算弧度制参数正弦值的用法,包括语法、参数类型、返回值与可运行的查询示例。文章同时结合当前仓库中 BE(Backend)侧的函数注册与向量化实现源码,剖析SIN在 StarRocks 内部如何被解析、编译并高效执行,帮助读者既会用它做数值计算,也能理解其底层原理。相关文档原文位于 docs/en/sql-reference/sql-functions/math-functions/sin.md。

函数功能概述

SIN是 StarRocks 提供的三角函数之一,用于计算输入参数x的正弦值(sine)。需要特别注意的是:参数x必须以弧度(radian)为单位,而非角度(degree)。例如SIN(0)返回0SIN(pi()/2)返回1

在 StarRocks 的 SQL 函数体系中,SIN属于数学函数(Math Function),被归入标量(Scalar)函数类别,可直接出现在SELECT投影列、WHERE过滤条件以及表达式中,与COSTANASINSINH等三角函数并列(这些函数在 BE 源码 be/src/exprs/math_functions.cpp 中集中实现)。

语法

SIN(x);

函数名不区分大小写,即sin(x)Sin(x)SIN(x)等价。

参数说明

参数说明
x待计算正弦值的数值,支持 DOUBLE 数据类型。传入其他数值类型(如INTBIGINTDECIMAL)时,StarRocks 会依据隐式类型转换规则将其转换为DOUBLE后参与计算。

从函数注册表看,SIN的参数类型被固定声明为DOUBLE。在 FE 侧的函数签名定义(gensrc/script/functions.py)中,其声明为:

[10050, "sin", True, False, "DOUBLE", ["DOUBLE"], "MathFunctions::sin"],

各字段的含义如下:

  • 10050:函数在 StarRocks 内置函数表中的函数 ID;
  • "sin":函数名;
  • 第 3 个布尔值:True表示支持向量化执行(Vectorized Execution);
  • 第 4 个布尔值:False表示非聚合类函数;
  • 第一个"DOUBLE":返回值类型为DOUBLE
  • ["DOUBLE"]:入参类型列表,仅接受一个DOUBLE类型参数;
  • "MathFunctions::sin":映射到 BE 端 C++ 实现入口MathFunctions::sin

也就是说,SIN在 StarRocks 中是一个单入参、双精度、支持向量化的纯标量函数,这决定了它既能在行式处理中工作,也能在批量列式计算中被高效执行。

返回值

返回值为DOUBLE数据类型,数值范围落在闭区间[-1, 1]内(正弦函数的数学值域)。

  • 当入参为NULL时,返回NULL(遵循 SQL 标准的三值逻辑);
  • 当入参为NaN(非数值)或Infinity(无穷大)时,计算得到的结果为NaN

使用示例

1. 文档中的基础示例

原文给出了最直接的常量计算示例:

mysql> select sin(3.14); +-----------------------+ | sin(3.14) | +-----------------------+ | 0.0015926529164868282 | +-----------------------+ 1 row in set (0.21 sec)

3.14是圆周率π的两位小数近似值,因此SIN(3.14)的结果约等于SIN(π) = 0,即0.0015926529164868282这样一个接近零的极小值。这恰好说明了弧度制下该函数的数值行为:SIN的参数是弧度而不是角度。

2. 结合内置常量与四则运算

StarRocks 内置pi()函数(返回DOUBLE类型的圆周率常量,实现在 be/src/exprs/math_functions.cpp,返回M_PI),可写出更精确的示例:

mysql> select sin(pi()); +----------------------+ | sin(pi()) | +----------------------+ | 1.2246467991473532e-16 | +----------------------+ 1 row in set (0.10 sec) mysql> select sin(pi()/2); +-------------+ | sin(pi()/2) | +-------------+ | 1 | +-------------+ 1 row in set (0.10 sec)

SIN(pi())的结果1.2246467991473532e-16是浮点数表示π时产生的舍入误差,数学上即为0;而SIN(pi()/2)精确等于1,是正弦函数的最大值点。

3. 对列数据进行计算

实际业务中SIN更常用于对表中某一列逐行计算:

mysql> select angle, sin(angle) from sample_angles; +-------+--------------------+ | angle | sin(angle) | +-------+--------------------+ | 0 | 0 | | 1 | 0.8414709848078965 | | -1 | -0.8414709848078965 | +-------+--------------------+ 3 rows in set (0.05 sec)

从结果可以看到,SIN是奇函数,SIN(-x) = -SIN(x),且计算为**逐元素(element-wise)**进行,可无缝嵌入SELECTWHEREORDER BY等任意表达式位置:

-- 筛选正弦值大于 0.5 的行 SELECT angle FROM sample_angles WHERE sin(angle) > 0.5; -- 用正弦值构造新的派生列 SELECT angle, sin(angle) * 100 AS normalized FROM sample_angles;

底层实现:向量化与 NaN 防护

SIN在 BE 端的实现位于 be/src/exprs/math_functions.cpp,对应头文件声明见 be/src/exprs/math_functions.h:

DEFINE_MATH_UNARY_WITH_OUTPUT_NAN_CHECK_FN_WITH_IMPL(sin, TYPE_DOUBLE, TYPE_DOUBLE, std::sin);

这一行宏展开后完成三件事:

  1. 内核函数:直接委托给 C++ 标准库的std::sin,保证数值精度与标准库一致;
  2. 类型映射:入参类型TYPE_DOUBLE、返回类型TYPE_DOUBLE,与 FE 侧注册表 gensrc/script/functions.py 中声明的DOUBLE -> DOUBLE完全对应;
  3. 输出 NaN 检查:宏DEFINE_MATH_UNARY_WITH_OUTPUT_NAN_CHECK_FN(定义见 be/src/exprs/math_functions.cpp)将求值器包装为VectorizedOutputCheckUnaryFunction<sinImpl, NanCheck>,其中NanCheck(be/src/exprs/math_functions.cpp)会在每个输出值上执行std::isnan(value)检查。

这里的“向量化”是关键:StarRocks 的表达式求值采用**批量列式(vectorized)**执行模型,sin不再逐行调用函数,而是对整列数据一次性送入VectorizedStrictUnaryFunction模板求值器,通过 SIMD 友好的循环对一整个DoubleColumn计算正弦,从而大幅摊薄函数调用开销。这正是 StarRocks 能在大数据量、高并发分析场景下保持亚秒级响应的重要基础之一。

同理,COSTANASINACOSSINHCOSHTANH等函数在源码中采用完全相同的宏模板(见 be/src/exprs/math_functions.cpp),学习SIN的实现模式即可举一反三。

使用注意事项

  • 弧度制SIN(30)的结果是30弧度的正弦(约-0.988),并非30°的正弦。如需角度制计算,可先通过角度转弧度公式换算:SIN(angle_in_degree * pi()/180)
  • 精度边界:由于DOUBLE是 IEEE 754 双精度浮点数,参数接近π的整数倍时,结果会呈现极小但非零的舍入误差(如示例中的SIN(3.14)),这是浮点运算的正常表现。
  • NULL 与异常值NULL输入返回NULLNaN/±Infinity输入经NanCheck防护后返回NaN,不会导致查询报错或 BE 进程异常。
  • 与其他三角函数协同SIN常与COSTAN配合完成信号处理、坐标换算、统计计算等场景;需要反函数时使用ASIN

总结

SIN是 StarRocks 中一个接口简洁、语义明确的数学函数:以DOUBLE弧度值入参,返回DOUBLE正弦值。其背后则是一条从 FE 函数注册表(gensrc/script/functions.py)到 BE 向量化实现(be/src/exprs/math_functions.cpp)的完整链路,体现了 StarRocks“SQL 接口简单、执行引擎高效”的设计理念。无论是日常数值分析,还是深度理解 StarRocks 向量化表达式框架,SIN都是一个理想的切入点。

【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询