使JavaScript的Uint8Array支持读取、写入Half(半精度浮点数)
简单引用百度百科的说明:
半精度浮点数是一种计算机使用的二进制浮点数数据类型。半精度浮点数使用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(半精度浮点数)相关推荐
- javascript 的Uint8Array 构造函数对 typedArray的引用问题
javascript 的 Uint8Array 支持字节数据,对于操作二进制数据非常有用,笔者初次接触时发现它有几个构造函数,如下: new Uint8Array(); new Uint8Array( ...
- Qone 正式开源,使 javascript 支持 .NET LINQ
Qone 下一代 Web 查询语言,使 javascript 支持 LINQ Github: github.com/dntzhang/qo- 缘由 最近刚好修改了腾讯文档 Excel 表格公式的一些 ...
- 【开源】Qone 正式发布,使 javascript 支持 .NET LINQ
Qone 下一代 Web 查询语言,使 javascript 支持 LINQ Github: https://github.com/dntzhang/qone 缘由 最近刚好修改了腾讯文档 Excel ...
- php怎么从文件中读取数据库连接,PHP连接 读取 写入mysql数据库的方法 附常用代码...
MYSQL一般都是和PHP配套使用用来建设网站,这里提供PHP连接MySQL数据库以及读取写入数据库的方法,供大家参考使用: 1.为了更好地设置数据连接,一般会将数据连接所涉及的值定义成变量. $my ...
- [js]windows下通过命令行运行javascript脚本,支持命令行参数
windows下通过命令行运行javascript脚本,支持命令行参数 js作为最受欢迎的语言,以其方便.通用.功能强大的特点,可以给大家在实际使用的过程中带来很大的便利. 下面是本文从实际应用的角度 ...
- JavaScript面向对象的支持(7)
================================================================================ Qomolangma OpenProj ...
- python关闭读写的所有的文件-Python文件操作:文件的打开关闭读取写入
Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...
- java excel row遍历空_Java poi读取,写入Excel,处理row和cell可能为空的情况
首先需要导入包 import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.NP ...
- 使用Java中的FileChannel和ByteBuffer在文件中读取/写入文件
过去,我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO,在本Java NIO教程中,我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据 ...
最新文章
- ASP.NET Web Services Tutorial
- SH 脚本注意事项之 IF 判断
- 计算机硬件市场调查清单,微型计算机组装与维护实用教程王际川第8章节组装计算机.ppt...
- keras 实现BP神经网络
- powershell 下独立silent 安装 浏览器问题
- [react] 为什么建议Fragment包裹元素?它的简写是什么?
- Linux系统添加永久静态路由的方法
- python或anaconda下安装opencv提示Error:No matching distribution found for opencv
- 【Dexclassloader】学习
- 基于ASP.NET的开源Blog程序总结
- 我的树莓派3配置脚本
- 中学生计算机制作大赛作品,“全国中小学电脑制作大赛”全校征集啦!
- 施耐德电气技术文档集
- 数学三角形和倒三角形公式表达了什么
- win7计算机u盘不显示盘符,win7系统识别U盘但不显示盘符该如何解决?
- 读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
- 考研:2023寒假复习及2022复试问题
- 一个很好用的vue表单工具,快速进行表单开发
- aptx与ldac音质区别_搞清楚LDAC、aptX这些蓝牙编码都有啥区别
- 推荐 25 个优雅的 jQuery Tooltip 插件
热门文章
- python中无限遍历在多维嵌套字典、列表的JSON中获取路径path跟对应的值——find_path(终极版)
- 【转】SFU级联解决方案——Licode
- Allegro的模块化设计
- 64位WIN10下安装.net2.0
- 十进制小数化为二进制小数的方法是什么_10、进制转换:二进制、八进制、十六进制、十进制之间的转换...
- 记录--JS精粹,原型链继承和构造函数继承的 “毛病”
- 使用 Canonical MAAS 部署 openEuler 测试
- 查缺补漏:一文清晰理解Excel替换那些事
- 如何明晰定位与责任_学会如何自我定位
- 为什么感觉假期还没开始就快要结束了?