Float16 on TypedArrays, DataView, Math.f16round S4
中文标题:Float16Array:在 TypedArrays、DataView 和 Math.f16round 中支持半精度浮点数
- 阶段: Stage 4
- 状态: 已完成
- ECMAScript 版本: ES2025
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案为 JavaScript 添加 Float16Array 类型化数组、DataView 的 getFloat16/setFloat16 方法以及 Math.f16round,以支持半精度浮点数。它旨在解决 canvas 颜色、GPU 操作、WebGL 和 WebGPU 中不需要全精度且内存有限的用例。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
Float16Array
一个为 JavaScript 添加 float16(即半精度或 binary16)TypedArrays 的提案。
状态
作者:Kevin Gibbons
提案组:Leo Balter, Kevin Gibbons
截至 2025 年 2 月会议,此提案已进入 TC39 流程 的 Stage 4:它已完成,已合入 ecma262,并且 正在浏览器中发布。任何进一步讨论应在 其他地方 进行。
规范文本可在 此处 获取。
实现
此提案已准备好供引擎实现和发布。有关实现当前状态的详细信息,请参阅 此 issue。
动机
- 来自 Web 色彩 CG 的明确请求,用于其 float 支持的 canvas 用例。
- 对 GPU 操作很有用,因为通常不需要全精度,且内存限制很严格。
- WebGPU 支持 float16。它暴露/消费原始 ArrayBuffers。当这些缓冲区包含 32 位浮点数时,模式 是将缓冲区包装在
new Float32Array(...)中;但当它们包含 16 位浮点数时,这就不起作用了。 - 随着像 Stable Diffusion 这样的新工具,越来越相关,在许多机器上全精度表示无法放入 VRAM。
- WebGPU 支持 float16。它暴露/消费原始 ArrayBuffers。当这些缓冲区包含 32 位浮点数时,模式 是将缓冲区包装在
- WebGL/WebGL2 支持 float16。
- WebGL 的
OES_texture_half_float扩展和 WebGL2 支持 float16 纹理,同时两个EXT_color_buffer_half_float扩展 支持 float16 渲染目标。它们暴露/消费 Uint16Arrays;这不容易处理。
- WebGL 的
- ARM、IA-32 和 Intel® 64 架构支持 float16 内在函数。
- 在 C++23 规范中,
std::float16_t将被支持 以调用 CPU 指令。
- 在 C++23 规范中,
- 在用户空间中模拟它有 严重的性能成本。
提案
这将添加一种新的 TypedArray 类型 Float16Array,以补充现有的 Float32Array 和 Float64Array。它还将为 DataView 添加两个新方法,用于读取和设置 float16 值,即 getFloat16 和 setFloat16,以补充现有的用于全精度和双精度浮点数的类似方法,以及 Math.f16round,以补充现有的 Math.fround。
用户空间
@petramoriken 有 一个实现 Float16Array 的包,在 npm 上每周下载量超过 10 万次。请参阅该仓库以了解纯在用户空间实现此功能的一些限制和缺点的示例 - 特别是无法正确集成其他 web 平台功能,如 WebGL 的 HALF_FLOAT 缓冲区和 structuredClone。