Fused Multiply-Add S2
中文标题:融合乘加
- 阶段: Stage 2
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案将融合乘加运算添加到 ECMAScript,该运算以单次舍入步骤计算 x × y + z,避免了中间舍入误差。这是一种标准的 IEEE 754 运算,得到现代硬件支持,并已在许多编程语言中实现,有助于点积和矩阵乘法等数值算法。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
融合乘加
阶段:2
倡导者:Waldemar Horwat @waldemarhorwat
融合乘加是一种三操作数的 IEEE 浮点运算,执行计算 $x × y + z$,乘积没有中间舍入——只有最终结果被舍入。它是一种标准运算,得到现代浮点硬件的支持,并且是 IEEE 754-2019 所要求的。
背景
IEEE 754 标准除了其他类型的运算外,还要求六种基本算术运算:+、-、×、/、平方根和融合乘加。前五种是原有的,而融合乘加在 IEEE 754-2008 中添加。
ECMAScript 从一开始就实现了前五种运算,但在 2008 年更新 IEEE 754 规范时没有包含融合乘加。我们建议将其添加到该语言中。
融合乘加在其他主要编程语言中受到 IEEE 754 语义的支持,包括:
- C/C++:
fma,fmaf,fmal - Java:
Math.Fma - C#:
Math.FusedMultiplyAdd - Python:
math.fma - Rust:
mul_add - Swift:
addProduct,addingProduct
用法
融合乘加,一种现代硬件支持的基本浮点指令,对许多数值算法的正确性和性能至关重要。它在 ECMAScript 中的缺失对试图移植在其他语言中使用它的代码的人提出了挑战——融合乘加很难作为库实现,需要数百行缓慢而棘手的代码。
常见用途包括计算点积、矩阵乘法、多项式求值以及神经网络应用。
对于一个简单的使用融合乘加的例子,以下是如何计算 Number $a$ 和 $b$ 的精确乘积而无需舍入:
let high = a * b (使用标准 IEEE 754 乘法)
let err = Math.fma(a, b, -high)
此时,除非 Number 的指数范围发生上溢或下溢,否则 $MV(a) × MV(b) = MV(high) + MV(err)$,其中 $high$ 包含结果的最高有效位,$err$ 包含结果的最低有效位。