简单引用百度百科的说明:

  半精度浮点数是一种计算机使用的二进制浮点数数据类型。半精度浮点数使用2字节(16位)存储。在IEEE 754-2008中,它被称作binary16。这种类型只适合用来存储那些对精度要求不高的数字,而不适合用来计算。

  与Single(单精度浮点数)、Double(双精度浮点数)相比,Half(半精度浮点数)的使用场合并不多,使用频率也不高,但在一些情形下还是需要用得到。

  在使用JavaScript读取二进制文件流时,需要从Uint8Array读取Half(半精度浮点数)或者写入其中,可参照使用以下代码段。

首先定义LittleEndian,如果已明确LittleEndian可以跳过:

var LittleEndian = (function() {var b = new ArrayBuffer(2);new DataView(b).setInt16(0, 1, true);return new Int16Array(b)[0] == 1;
})();

然后将方法添加到Uint8Array的prototype中,或者你可以采取其他形式:

(其中可选参数s是表示起始位置,e为大小字节序)

Uint8Array.prototype.getFloat16 = function() {var s = (arguments.length > 0 ? arguments[0] : 0);var e = (arguments.length > 1 ? arguments[1] : LittleEndian);if ((s < 0) || (s > this.length - 1)) {return 0;}var mantissa = function(n) {var v = 0;switch (true) {case (n >= 1) && (n < 1024):var m = n << 13;var e = 0;while ((m & 0x00800000) == 0) {e -= 0x00800000;m <<= 1;}m &= ~0x00800000;e += 0x38800000;v = m | e;break;case (n >= 1024) && (n < 2048):v = 0x38000000 + ((n - 1024) << 13);break;}return v;};var exponent = function(n) {var v = 0;switch (true) {case (n >= 1) && (n < 31):v = n << 23;break;case (n == 31):v = 0x47800000;break;case (n == 32):v = 0x80000000;break;case (n >= 33) && (n < 63):v = 0x80000000 + ((n - 32) << 23);break;case (n == 63):v = 0xC7800000;break;}return v;};var offset = function(n) {var v = 0;switch (true) {case (n >= 1) && (n < 64):v = (n == 32 ? 0 : 1024);break;}return v;};var float32 = new Float32Array(1);var int32 = new Int32Array(float32.buffer);var b = new DataView(this.buffer,s,2).getInt16(0, e)var m = b >> 10;int32[0] = mantissa((b & 0x3FF) + offset(m)) + exponent(m);return float32[0];
};
Uint8Array.prototype.setFloat16 = function(t) {var s = (arguments.length > 1 ? arguments[1] : 0);var e = (arguments.length > 2 ? arguments[2] : LittleEndian);if ((s < 0) || (s > this.length - 1)) {return this;}var float32 = new Float32Array(1);var int32 = new Int32Array(float32.buffer);float32[0] = t;var x = int32[0];var b = (function() {var v = (x >> 16) & 0x8000;var m = (x >> 12) & 0x07FF;var e = (x >> 23) & 0xFF;if (e < 103) {return v;}if (e > 142) {v |= 0x7c00;v |= ((e == 0xFF) ? 0 : 1) && (x & 0x007fffff);return v;}if (e < 113) {m |= 0x0800;v |= (m >> (114 - e)) + ((m >> (113 - e)) & 1);return v;}v |= ((e - 112) << 10) | (m >> 1);v += m & 1;return v;})();new DataView(this.buffer,s,2).setInt16(0, b, e);
};

使用时直接执行对应方法即可。

使JavaScript的Uint8Array支持读取、写入Half(半精度浮点数)相关推荐

  1. javascript 的Uint8Array 构造函数对 typedArray的引用问题

    javascript 的 Uint8Array 支持字节数据,对于操作二进制数据非常有用,笔者初次接触时发现它有几个构造函数,如下: new Uint8Array(); new Uint8Array( ...

  2. Qone 正式开源,使 javascript 支持 .NET LINQ

    Qone 下一代 Web 查询语言,使 javascript 支持 LINQ Github: github.com/dntzhang/qo- 缘由 最近刚好修改了腾讯文档 Excel 表格公式的一些 ...

  3. 【开源】Qone 正式发布,使 javascript 支持 .NET LINQ

    Qone 下一代 Web 查询语言,使 javascript 支持 LINQ Github: https://github.com/dntzhang/qone 缘由 最近刚好修改了腾讯文档 Excel ...

  4. php怎么从文件中读取数据库连接,PHP连接 读取 写入mysql数据库的方法 附常用代码...

    MYSQL一般都是和PHP配套使用用来建设网站,这里提供PHP连接MySQL数据库以及读取写入数据库的方法,供大家参考使用: 1.为了更好地设置数据连接,一般会将数据连接所涉及的值定义成变量. $my ...

  5. [js]windows下通过命令行运行javascript脚本,支持命令行参数

    windows下通过命令行运行javascript脚本,支持命令行参数 js作为最受欢迎的语言,以其方便.通用.功能强大的特点,可以给大家在实际使用的过程中带来很大的便利. 下面是本文从实际应用的角度 ...

  6. JavaScript面向对象的支持(7)

    ================================================================================ Qomolangma OpenProj ...

  7. python关闭读写的所有的文件-Python文件操作:文件的打开关闭读取写入

    Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...

  8. java excel row遍历空_Java poi读取,写入Excel,处理row和cell可能为空的情况

    首先需要导入包 import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.NP ...

  9. 使用Java中的FileChannel和ByteBuffer在文件中读取/写入文件

    过去,我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO,在本Java NIO教程中,我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据 ...

最新文章

  1. ASP.NET Web Services Tutorial
  2. SH 脚本注意事项之 IF 判断
  3. 计算机硬件市场调查清单,微型计算机组装与维护实用教程王际川第8章节组装计算机.ppt...
  4. keras 实现BP神经网络
  5. powershell 下独立silent 安装 浏览器问题
  6. [react] 为什么建议Fragment包裹元素?它的简写是什么?
  7. Linux系统添加永久静态路由的方法
  8. python或anaconda下安装opencv提示Error:No matching distribution found for opencv
  9. 【Dexclassloader】学习
  10. 基于ASP.NET的开源Blog程序总结
  11. 我的树莓派3配置脚本
  12. 中学生计算机制作大赛作品,“全国中小学电脑制作大赛”全校征集啦!
  13. 施耐德电气技术文档集
  14. 数学三角形和倒三角形公式表达了什么
  15. win7计算机u盘不显示盘符,win7系统识别U盘但不显示盘符该如何解决?
  16. 读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
  17. 考研:2023寒假复习及2022复试问题
  18. 一个很好用的vue表单工具,快速进行表单开发
  19. aptx与ldac音质区别_搞清楚LDAC、aptX这些蓝牙编码都有啥区别
  20. 推荐 25 个优雅的 jQuery Tooltip 插件

热门文章

  1. python中无限遍历在多维嵌套字典、列表的JSON中获取路径path跟对应的值——find_path(终极版)
  2. 【转】SFU级联解决方案——Licode
  3. Allegro的模块化设计
  4. 64位WIN10下安装.net2.0
  5. 十进制小数化为二进制小数的方法是什么_10、进制转换:二进制、八进制、十六进制、十进制之间的转换...
  6. 记录--JS精粹,原型链继承和构造函数继承的 “毛病”
  7. 使用 Canonical MAAS 部署 openEuler 测试
  8. 查缺补漏:一文清晰理解Excel替换那些事
  9. 如何明晰定位与责任_学会如何自我定位
  10. 为什么感觉假期还没开始就快要结束了?