我正在JavaScript中重新实现一些C代码,为了通过测试,我需要JavaScript代码返回与C代码相同的结果。C 代码专门处理单精度浮点数(而 JavaScript 的number
是双精度(。
例如,在 C 中,-3.12744117f + 8.60676003f
等于 5.47931862f
。在 JavaScript 中,-3.12744117 + 8.60676003
等于 5.47931886
,这是不同的(Math.fround
返回 5.479319095611572
,这更不对劲(。
我知道 JavaScript 的结果在技术上"更正确",但我在这里的目标是与不太精确的 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 对应答案。