JavaScript中的单精度数学

问题描述 投票:2回答:1

我在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标准,还是有其他方法?

javascript c ieee-754
1个回答
1
投票

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

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对应答案四舍五入到小数点后八位。

© www.soinside.com 2019 - 2024. All rights reserved.