将数字转换为16位浮点数(存储为字节)并返回?

时间:2015-02-24 05:36:07

标签: javascript floating-point

对于(有损)压缩目的,我希望能够将Javascript数字转换为16位浮点表示形式,以存储在Uint16Arrays(或Uint8Arrays中,无论哪个最简单。)然后我&#39 ; d希望能够从2个字节转换回数字。我不需要对16位数字执行任何算术,它只是用于紧凑存储。

我无法找到执行此操作的算法。它不需要是IEEE标准,只需要精确到几位小数。

浮点数优于固定点,因为我不需要预先确定值的范围。

1 个答案:

答案 0 :(得分:2)

编码

第一步是提取数字的指数和标准化分数。在C中,这是使用JavaScript中不可用的frexp函数完成的。谷歌搜索frexp javascript会产生几个实现。

例如,这里的straight-forward implementation使用类型化数组直接从IEEE表示中提取位。这是quick-and-dirty, inexact version仅使用Math个功能。这是exact (?) version

第二步是使用位操作从获得的指数和尾数创建16位FP编号。确保检查指数范围并对低精度尾数进行舍入以获得更高的准确度。

解码

从16位FP编号中提取指数和尾数。使用

将它们转换为JavaScript编号
// The value of 'adjust' depends on the size of the mantissa.
Math.pow(2, exponent - adjust) * mantissa

或直接创建带有类型数组的IEEE位模式。

次正规数,无穷大,NaN

可以将次正规JavaScript数字简化为零。您必须决定是否要支持16位格式的次正规数。这将使转换过程复杂化,以换取更接近零的数字的准确性。

您还必须决定是否以您的格式支持无限和NaN。这些值的处理方式与IEEE格式类似。