JavaScript 中的单精度数学

Single precision math in JavaScript

我正在 JavaScript 中重新实现一些 C 代码,为了通过测试,我需要 JavaScript 代码 return 与 C 代码相同的结果。 C 代码专门处理单精度浮点数(而 JavaScript 的 number 是双精度)。

例如,在 C 中,-3.12744117f + 8.60676003f 等于 5.47931862f。在JavaScript中,-3.12744117 + 8.60676003等于5.47931886,这是不一样的(Math.froundreturns5.479319095611572,这就更离谱了)。

我知道 JavaScript 结果在技术上是 "more correct",但我的目标是与不太精确的 C 对应部分保持一致。

有没有办法在 JavaScript 中应用 32 位操作?是需要手动实现IEEE 574标准,还是有其他方法?

如果您要在应用操作之前转换操作数,您的尝试应该是富有成效的;

Math.fround(Math.fround(-3.12744117) + Math.fround(8.60676003))

或者,JavaScript Float32Array 类型的数组应是替代方法。例如;

(new Float32Array([-3.12744117, 8.60676003])).reduce((a, e) => Math.fround(a + e))

这两个权宜之计产生的值 5.479318618774414 相当于预期的 C 对应答案四舍五入到小数点后八位。