我正在用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标准,还是有其他方法?
答案 0 :(得分: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对应答案四舍五入到小数点后八位。