探秘 NaN 隐秘世界:IEEE 754 标准下的特殊值应用及 JavaScriptCore 案例
NaN 的隐秘世界2018 年 3 月浮点标准定义了非数字Not-a-NumberNaN用于表示非数字的值。双精度 NaN 有 51 位有效负载可在动态类型语言运行时表示其他非浮点数值及其类型。2019 年 4 月更新作者在 2019 年的!!con West 大会上做了关于 NaN 隐秘世界的闪电演讲演讲录像可在 这里 找到。NaN 的公开一面当提到“NaN”和“浮点”时特指 IEEE 754 - 2008 中定义的表示方法该标准诞生于 1985 年源于对规范表示法的需求以解决不同处理器使用不一致的浮点表示法带来的混乱问题。浮点值是对实数的离散、类似对数形式的近似。IEEE 754 - 2008 超简要概述该标准定义了以 2 为底和以 10 为底的值的类似对数分布表示。对于以 2 为底标准定义了位宽为 16 位到 256 位之间所有 2 的幂次方的表示方法对于以 10 为底定义了位宽为 32 位到 128 位之间所有 2 的幂次方的表示方法。以 binary16 为例其格式为“1 符号位 | 5 指数位 | 10 尾数位”。该标准还定义了特殊值如 ±无穷大、“安静”quiet和“发信号”signaling的 NaN。IEEE 754 - 2008 对 NaN 的定义所有二进制 NaN 的位串其偏移指数域 E 的所有位都设置为 1。“安静”的 NaN 位串应将尾数位域 T 的第一位d1编码为 1“发信号”的 NaN 位串应将尾数位域的第一位编码为 0。现代通用硬件通常使用 64 位浮点数双精度格式的尾数位有 52 位意味着有 51 位可作为有效负载。“发信号”的 NaN 可用于表示未初始化的变量等可能引发异常“安静”的 NaN 应提供追溯诊断信息操作结果中的 NaN 应尽可能保留这些信息。有效负载能用来做什么人们利用 NaN 的有效负载在动态类型语言中传递数据和类型信息如 Lua 和 JavaScript 的实现。一本教科书 提出可在符号表达式解析器中使用 NaN 作为符号或把 NaN 用作缺失数据的值并使用有效负载指示缺失数据的来源或类别但未找到相关实现。有效负载的实际应用JavaScriptCore 案例分析NaN 装箱技术下语言中的所有值及其类型标签都用 64 位表示。JavaScriptCoreJSC使用 NaN 装箱并非唯一在 NaN 中存储其他类型的工业级实现Mozilla 的 SpiderMonkey、LuaJIT 也采用了这种方式。JSC 是为 WebKit 提供支持的 JavaScript 实现WebKit 驱动着 Safari 和 Adobe 的创意套件。截至 2018 年 3 月相关代码仍在 Safari 中使用。注释中的 NaN 装箱解释文件 显示NaN 装箱将非浮点数据类型存储在有效负载中用最高位编码有效负载的类型。可存储 32 位整数和 48 位指针。不同的值范围用于表示不同类型的对象代码中的范围与 IEEE - 754 标准定义的范围有所偏移是为了方便处理指针。通过查看文件中的掩码能更清楚了解范围偏移情况。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2562423.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!