ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

StarRocks exp / dexp 函数详解:e 的指数运算、用法示例与溢出边界

2026/9/19 20:05:04 拓冰建站 浏览量
StarRocks exp / dexp 函数详解:e 的指数运算、用法示例与溢出边界 数据库OLAP数据仓库大数据湖仓一体数据分析【免费下载链接】starrocksThe worlds 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点击查看免费下载exp别名dexp是 StarRocks 提供的自然指数函数用于计算自然常数 e 的 x 次幂即e^x是数据分析与建模中指数增长、衰减、概率计算等场景的基石函数。本文以官方文档 exp.md 为核心结合 BE 端源码实现与单元测试完整讲解其语法、参数、返回值、示例并深入剖析其溢出返回 NULL 的边界行为与向量化执行原理帮助读者在查询中正确、高效地使用该函数。函数概述exp 与 dexp 的关系exp(x)返回自然常数 e约 2.718281828459045的 x 次幂即数学中的指数函数e^x。它是自然对数函数ln(x)StarRocks 中的ln的逆运算exp(ln(x)) xx 0。官方文档将函数名写作exp,dexp其中dexp是exp的别名。这一别名关系在函数注册表中可以直接看到gensrc/script/functions.py 中两条记录声明了完全相同的函数签名[10180, exp, True, False, DOUBLE, [DOUBLE], MathFunctions::exp], [10181, dexp, True, False, DOUBLE, [DOUBLE], MathFunctions::exp],两条记录均映射到 BE 端的MathFunctions::exp实现因此exp与dexp在任何场景下都是等价的二者可以互换使用。此外FE 端的 FunctionSet.java 中也同时定义了EXP与DEXP两个常量用于函数注册与解析。语法与参数exp的语法非常简洁只有一个参数EXP(x);各组成部分说明如下项目说明函数名EXP不区分大小写别名DEXP参数x指数幂支持 DOUBLE 类型可传入常量、列或任意数值表达式返回类型DOUBLE参数说明中值得注意的几点官方文档明确指出x支持 DOUBLE。从函数注册表看exp只注册了DOUBLE - DOUBLE这一种签名这意味着其他数值类型如 INT、DECIMAL、FLOAT在调用时会被隐式转换为 DOUBLE 后参与运算由于底数 e 是超越数、结果本身是浮点数该函数天然适合对连续型数值列如时间、利率、分数做逐行指数变换而非用于精确的定点计算与 MySQL 等数据库的习惯一致exp也被 StarRocks 归入 ODBC 标量函数集合见 OdbcScalarFunctionCall.java这意味着通过 ODBC/JDBC 标准接口书写的{fn EXP(x)}形式调用同样可被解析执行。返回值说明函数返回 DOUBLE 类型数值即e^x的浮点近似值。IEEE 754 双精度浮点数决定了结果存在以下特性exp(0)恒等于 1任何非零数的 0 次幂均为 1exp(1)等于自然常数 e即 2.718281828459045当x为负值时exp(x)返回 (0, 1) 区间内的正小数例如exp(-1)≈ 0.36787944117144233当x过大导致e^x超过 DOUBLE 能表示的最大值约 1.7976931348623157e308时函数不会返回Inf而是返回NULL详见下文“溢出边界”小节输入为 NULL 时输出为 NULLNULL 传播。使用示例基本调用官方文档给出的示例计算 e 的 3.14 次幂mysql select exp(3.14); -------------------- | exp(3.14) | -------------------- | 23.103866858722185 | -------------------- 1 row in set (0.01 sec)常量与特殊值-- 任何数的 0 次幂为 1 SELECT exp(0); -- 返回 1.0 -- e 的一次幂即 e 本身 SELECT exp(1); -- 返回 2.718281828459045 -- 负指数得到 (0,1) 区间的小数 SELECT exp(-1); -- 返回 0.36787944117144233 -- 指数为大数值时按科学计数法展示 SELECT exp(20); -- 返回 4.851651954097903e08对数据列进行指数变换exp最常见的用法是作用在表的数值列上例如对得分、时间间隔等列逐行做指数变换-- 对 user_score 列做指数变换用于后续归一化或 Softmax 类计算 SELECT user_id, exp(user_score) AS score_weight FROM user_profile; -- 结合聚合函数使用指数加权求和 SELECT exp(SUM(ln(amount))) AS product_of_amounts FROM order_detail;与其他函数组合使用由于exp是ln的逆运算二者组合可以完成指数/对数空间的往返换算常用于将乘性计算转换为加性计算-- 对任意正数 xexp(ln(x)) 恒等于 x浮点舍入误差范围内 SELECT exp(ln(100)); -- 返回 100.0 -- 与幂函数 pow 对照exp(x) 等价于 pow(e, x) SELECT exp(3.14), pow(2.718281828459045, 3.14);说明文档中将exp描述为自然对数函数natural logarithms function准确的表述是exp是自然对数函数ln的逆函数即指数函数它和ln互为反函数。溢出边界超大指数返回 NULL 而非 Inf这是exp函数最容易被忽视的行为。由于 DOUBLE 的最大值约为 1.7976931348623157e308而e^709≈ 8.218407461554972e307仍在范围内、e^710≈ 2.233994766161711e308已超界因此当指数x ≥ 710左右时数学结果将溢出为无穷大。BE 端为exp注册的实现宏明确包含了“输出 Inf/NaN 检查”be/src/exprs/math_functions.cppDEFINE_MATH_UNARY_WITH_OUTPUT_INF_NAN_CHECK_FN_WITH_IMPL(exp, TYPE_DOUBLE, TYPE_DOUBLE, std::exp);该宏定义见 math_functions.cpp将底层std::exp的计算结果包进VectorizedOutputCheckUnaryFunction..., InfNanCheck一旦发现输出为Inf或NaN就将其置为 NULL。也就是说溢出不会报错也不会返回无穷大而是静默返回 NULL。这一点在 BE 单元测试 math_functions_test.cpp 中得到了直接验证ExpTest对exp(0)、exp(2)、exp(709)断言结果与std::exp一致且均非 NULLInfNanTest对exp(710.0)、exp(2.47498282E8)、exp(2.47498282E3)断言结果全部为 NULL。据此可以在查询中预先规避或对结果做 NULL 兜底处理-- 规避对可能溢出的列先做截断再取指数 SELECT exp(LEAST(x, 700.0)) FROM t; -- 兜底用 COALESCE / IFNULL 处理溢出返回的 NULL SELECT IFNULL(exp(x), 1.7976931348623157e308) AS capped_exp FROM t;需要说明的是x取值极小如 -1000时e^x会下溢为 0这不属于错误函数正常返回 0。底层实现向量化一元函数从实现细节看exp是典型的向量化一元函数输入一列 DOUBLE输出一列 DOUBLE。整个调用链可以概括为注册FE/BE 元数据gensrc/script/functions.py中声明函数签名与实现符号MathFunctions::exp由代码生成流程产出注册代码FE 端 FunctionSet.java 同步声明函数名常量执行BEmath_functions.cpp 中的宏展开为MathFunctions::exp的向量化实现对整列数据批量调用 C 标准库的std::exp并通过InfNanCheck统一做结果合法性检查返回生成一列可空NullableDOUBLE 列溢出元素标记为 NULL。由于采用批量向量化执行exp在 StarRocks 列式引擎上对海量行的计算开销远低于逐行解释执行适合在投影、JOIN 过滤后的结果集上大规模使用。与相关数学函数的关系围绕exp仓库中还提供了成体系的指数/对数函数家族便于读者对照选用函数含义实现位置函数注册表exp/dexpe 的 x 次幂本文主题functions.py →MathFunctions::expe返回自然常数 e 的常量函数实现见 math_functions.cpp返回M_Eln/dlog1/log一元自然对数exp的逆运算functions.py →MathFunctions::lnpow/power/dpow/fpow任意底数的幂运算functions.py →MathFunctions::pow常用换算关系exp(x)等价于pow(e, x)ln(exp(x)) xexp(ln(a) ln(b)) a * b这是将乘法转为加法再还原的经典技巧。典型应用场景指数增长/衰减建模如按时间计算复利amount * exp(rate * years)或对衰减过程exp(-lambda * t)建模拟合概率与统计计算高斯分布密度函数、Softmax 归一化等都需要计算exp常配合SUM、窗口函数使用评分与权重换算将线性分数映射为指数权重再参与加权聚合对数域运算还原先ln累加避免大数相乘溢出最后exp还原结果。深入阅读官方函数文档docs/en/sql-reference/sql-functions/math-functions/exp.md函数注册与别名声明gensrc/script/functions.pyBE 向量化实现be/src/exprs/math_functions.cpp溢出与常规行为单元测试be/test/exprs/math_functions_test.cppFE 函数名注册fe/fe-core/src/main/java/com/starrocks/catalog/FunctionSet.javaODBC 标量函数兼容fe/fe-core/src/main/java/com/starrocks/sql/ast/expression/OdbcScalarFunctionCall.java赞分享数据库OLAP数据仓库大数据湖仓一体数据分析【免费下载链接】starrocksThe worlds 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 数学函数 TAN() 详解用法、示例与底层实现StarRocks 数学函数 TAN 详解用法、示例与底层实现 TAN x 是 StarRocks 提供的数学函数用于计算以 弧度 为单位的参数 x 的正切数据库OLAP数据仓库大数据湖仓一体数据分析StarRocks to_bitmap 函数详解BIGINT 转 BITMAP 的用法、边界与实现原理StarRocks to_bitmap 函数详解BIGINT 转 BITMAP 的用法、边界与实现原理 to_bitmap 是 StarRocks 位图函数族数据库OLAP数据仓库大数据湖仓一体数据分析StarRocks weeks_sub 函数详解DATETIME 周数减法运算的原理与实战StarRocks weeks_sub 函数详解DATETIME 周数减法运算的原理与实战 weeks_sub 是 StarRocks 提供的日期时间函数用数据库OLAP数据仓库大数据湖仓一体数据分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考