StarRocks e() 数学函数完全指南:常数 e 的语义、底层实现与组合用法
2026/9/18 13:06:59 网站建设 项目流程

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_PIe()使用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()返回常数 eDOUBLEmath_functions.cpp
pi()返回常数 πDOUBLEmath_functions.cpp
exp(x)/dexp(x)返回 e 的 x 次幂DOUBLEmath_functions.cpp(std::exp
ln(x)返回 x 的自然对数(底数为 e)DOUBLEmath_functions.cpp(std::log
log2(x)返回以 2 为底的对数DOUBLEmath_functions.cpp
log10(x)返回以 10 为底的对数DOUBLEmath_functions.cpp(std::log10
log(b, x)返回以 b 为底、x 的对数DOUBLEmath_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; -- 结果为 1

3. 概率与统计模型(softmax、Logistic 回归)

在特征工程或在线学习场景中,Logistic 函数σ(x) = 1 / (1 + e^(-x))可写为:

SELECT 1 / (1 + exp(-2.0)) AS sigmoid; -- 约等于 0.880797

4. 常量传播与表达式复用

由于e()会被 FE 常量折叠为字面量,它可以安全地出现在WHERECASE 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 优化阶段被常量折叠为字面量,几乎零开销。将其与explnlog等函数组合,即可在 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),仅供参考

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

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

立即咨询