对于(有损)压缩目的,我希望能够将Javascript数字转换为16位浮点表示形式,以存储在Uint16Arrays(或Uint8Arrays中,无论哪个最简单。)然后我&#39 ; d希望能够从2个字节转换回数字。我不需要对16位数字执行任何算术,它只是用于紧凑存储。
我无法找到执行此操作的算法。它不需要是IEEE标准,只需要精确到几位小数。
浮点数优于固定点,因为我不需要预先确定值的范围。
答案 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位模式。
可以将次正规JavaScript数字简化为零。您必须决定是否要支持16位格式的次正规数。这将使转换过程复杂化,以换取更接近零的数字的准确性。
您还必须决定是否以您的格式支持无限和NaN。这些值的处理方式与IEEE格式类似。