StarRocks e() 数学函数完全指南:常数 e 的语义、底层实现与组合用法
【免费下载链接】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
e()是 StarRocks 内置的无参数学函数,用于直接返回自然对数的底数(欧拉数)e ≈ 2.718281828459045。本文以官方文档 e.md 为核心骨架,结合 math_functions.cpp 的源码实现与 FE 侧的常量折叠机制,完整讲解其语法、数据类型、执行原理,并给出在复利计算、指数衰减建模、自然对数运算等场景下的可运行组合示例,帮助你准确、高效地使用这一基础数学常量。
函数定义
e()返回数学常数 e(自然对数的底数),即欧拉数。它是 StarRocks 数学函数 家族中极少数不需要任何参数即可求值的常量函数,与pi()属于同一类"常量返回型"函数。
语法
E();调用时函数名大小写不敏感,e()与E()等价;()必须保留,函数不接受任何参数,也不存在e(x)之类的重载形式。
参数
本函数不接受任何参数。
返回值
- 返回值类型为
DOUBLE(双精度浮点数); - 返回值为固定常量
2.718281828459045(即M_E的值,约等于2.718281828459045,精度为 IEEE 754 双精度可表达的最大精度)。
基础示例
官方文档给出了最直接的验证方式:在 MySQL 客户端中连接 StarRocks 后执行SELECT:
mysql> select e(); +-------------------+ | e() | +-------------------+ | 2.718281828459045 | +-------------------+ 1 row in set (0.01 sec)返回值固定为2.718281828459045,不随会话、数据库或表而变化,这与pi()(返回3.141592653589793)的行为完全一致。
底层实现原理
BE 端实现:常数列构造
e()的执行逻辑非常简洁,位于 math_functions.cpp:
StatusOr<ColumnPtr> MathFunctions::e(FunctionContext* context, const Columns& columns) { return ColumnHelper::create_const_column<TYPE_DOUBLE>(M_E, 1); }关键点解读:
- 函数直接调用
ColumnHelper::create_const_column<TYPE_DOUBLE>(M_E, 1),构造一个包含 1 行数据的const column(常量列),类型为TYPE_DOUBLE; - 常量值来自 C 标准库宏
M_E(定义于<cmath>/<math.h>),其值正是2.718281828459045; - 与 pi 的实现 一一对应——
pi()使用M_PI,e()使用M_E,两个函数共享同一套"构造常量列"的实现模式; - 从源码结构看,
e()不读取任何输入列(columns为空),也不依赖FunctionContext中的状态,因此执行成本极低,且天然具备向量化友好的特性。
FE 端优化:常量折叠
在前端(FE)的查询优化阶段,StarRocks 会对这类"无参常量函数"进行**常量折叠(constant folding)**处理:e()的表达式在生成执行计划时即可被求值为字面常量2.718281828459045,无需在 BE 侧逐行计算。这意味着在复杂查询中,e()的求值结果可以被复用、参与常量传播,而不会成为执行瓶颈。
相关的指数与对数函数对照
e()通常与 StarRocks 的指数、对数函数配合使用。下表整理了 exp.md、ln.md、log.md、log2.md、log10.md 中相关函数及其 BE 实现:
| 函数 | 说明 | 返回类型 | BE 实现位置 |
|---|---|---|---|
e() | 返回常数 e | DOUBLE | math_functions.cpp |
pi() | 返回常数 π | DOUBLE | math_functions.cpp |
exp(x)/dexp(x) | 返回 e 的 x 次幂 | DOUBLE | math_functions.cpp(std::exp) |
ln(x) | 返回 x 的自然对数(底数为 e) | DOUBLE | math_functions.cpp(std::log) |
log2(x) | 返回以 2 为底的对数 | DOUBLE | math_functions.cpp |
log10(x) | 返回以 10 为底的对数 | DOUBLE | math_functions.cpp(std::log10) |
log(b, x) | 返回以 b 为底、x 的对数 | DOUBLE | math_functions.cpp |
值得注意的实现细节:
exp(x)在 BE 端通过std::exp实现,并带有OUTPUT_INF_NAN_CHECK检查,即当结果溢出为无穷(INF)或非数值(NaN)时会被检测处理;ln(x)通过std::log实现,并带有NON_POSITIVE_CHECK检查——当输入x <= 0时返回NULL(而非报错),这是 StarRocks 数学函数在无效输入上的统一处理策略;e()与exp(1)在数学上严格相等:e() == exp(1)。
典型应用场景
e()本身返回常量,其价值体现在与其他函数组合构造数学模型:
1. 复利 / 指数增长模型
连续复利公式A = P * e^(r*t)可以直接翻译为 SQL:
-- 本金 1000,年利率 5%,连续复利 3 年 SELECT 1000 * exp(0.05 * 3) AS amount;也可以显式使用e()验证等价关系:
SELECT e() * e() AS e_squared, -- 等价于 exp(2) exp(2) AS exp2_result; -- 两者应相等2. 自然对数运算
对数恒等式ln(e) = 1可直接用于校验:
SELECT ln(e()) AS ln_of_e; -- 结果为 13. 概率与统计模型(softmax、Logistic 回归)
在特征工程或在线学习场景中,Logistic 函数σ(x) = 1 / (1 + e^(-x))可写为:
SELECT 1 / (1 + exp(-2.0)) AS sigmoid; -- 约等于 0.8807974. 常量传播与表达式复用
由于e()会被 FE 常量折叠为字面量,它可以安全地出现在WHERE、CASE WHEN、窗口函数表达式等任意位置而不会带来额外开销:
SELECT order_id, revenue, CASE WHEN revenue > e() * 100 THEN 'high' ELSE 'normal' END AS bucket FROM sales;注意事项
- 大小写不敏感:
e()、E()、E()均可正常调用,但必须带空括号; - 无参数版本:
e()不接受任何参数,传参将报语法错误; - 返回值精度:返回
DOUBLE类型,展示为2.718281828459045(15 位有效数字);在强类型场景下可通过CAST(e() AS DECIMAL(10, 6))等显式转换控制精度; - 与
exp的区别:e()是常量函数,exp(x)是指数函数;两者关系为e() = exp(1),不要混淆; - 文档位置:本函数的完整官方说明位于 e.md,同目录下还包含 pi.md、exp.md 等配套函数文档,可一并查阅。
小结
e()是 StarRocks 中最轻量的函数之一:语法上无参数、返回固定 DOUBLE 常量2.718281828459045;实现上由 BE 端 MathFunctions::e 通过ColumnHelper::create_const_column<TYPE_DOUBLE>(M_E, 1)构造常量列完成,并在 FE 优化阶段被常量折叠为字面量,几乎零开销。将其与exp、ln、log等函数组合,即可在 SQL 中直接落地复利计算、指数衰减、概率模型等常见数学运算,是数据分析与特征工程中可靠且高效的"数学常量工具箱"成员。
【免费下载链接】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),仅供参考