【问题标题】:How to convert the "uint16" value to half-precision float (i.e. "float16")? [duplicate]如何将“uint16”值转换为半精度浮点数(即“float16”)? [复制]
【发布时间】:2016-11-26 10:24:32
【问题描述】:

我必须解压缩一个二进制文件,其中一些值是半精度浮点数(即float16)。

我使用规范 API dataView.getUint16(0) 从二进制流中读取它。

如何使用 JavaScript 转换 uint16 格式back tofloat16` 格式的数字?

【问题讨论】:

  • 阅读this - 看看你能不能弄明白
  • 顺便说一句,javascript 没有“float16”,因此您永远不会将其转换为实际的 float16 - 您可以将其转换为 Number,或者事件为 float32 或 float64(数字) - 如果您要做的是读取“float16”,操作该值并存储/写入/发送“float16” - 您需要首先将 uint16 中的二进制数据转换为数字,对其进行操作,然后将其转换回 uint16

标签: javascript binary


【解决方案1】:

Javascript 中的所有数字变量都被视为 64 位浮点数(双精度)。

一旦你将它从 DataView 读取到一个变量中,它将是那种形式。

DataView 对象上的set* 方法允许您使用各种打包形式在 ArrayBuffer 中设置字节:

dv.setUint16(0, 12);
dv.getUint16(0); // >>> 12

但你必须小心自己夹住它:

dv.setUint16(0, -12);
dv.getUint16(0); // >>> 65524

对于带符号的 int16:

dv.setInt16(0, -12);
dv.getInt16(0); // >>> -12

【讨论】:

  • 如果您将“float16”读为 uint16,您将无法通过魔法获得 float64。 float 16 中的 1 是二进制 0 01111 0000000000 - 当读取为 uint16 时将读取为 15,360
  • 我的意思是,一旦它被读入一个变量,后备存储就变成了float64,不需要转换它来使其签名。
  • 是的,问题是,转换它
猜你喜欢
  • 2020-02-03
  • 2013-04-16
  • 2011-11-17
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多