为什么没有 2 字节浮点并且已经存在实现?

2024-05-11

假设我真的内存不足并且想要更小的范围(类似于short vs int)。着色器语言已经支持half对于半精度的浮点类型(不仅仅是来回转换使值在 -1 和 1 之间,即返回一个像这样的浮点数:shortComingIn / maxRangeOfShort)。是否已经存在 2 字节浮点数的实现?

我也有兴趣知道为什么没有 2 字节浮点的任何(历史?)原因。


TL;DR:16 位浮点数确实存在,并且有各种软件和硬件实现

目前有2种常见的标准16位浮点格式:IEEE-754 二进制16和谷歌的bfloat16。由于它们是标准化的,显然任何了解规范的人都可以编写实现。一些例子:

  • https://github.com/ramenhut/half https://github.com/ramenhut/half
  • https://github.com/minhhn2910/cuda-half2 https://github.com/minhhn2910/cuda-half2
  • https://github.com/tianshilei1992/half_ precision https://github.com/tianshilei1992/half_precision
  • https://github.com/acgessler/half_float https://github.com/acgessler/half_float

或者如果你不想使用它们,你也可以设计一个不同的16位浮点格式并实现它


一般不使用 2 字节浮点数,因为即使float 的精度不足以满足正常操作 and double应始终默认使用,除非您受到带宽或缓存大小的限制。浮点文字也是double在 C 和类 C 语言中使用时不带后缀。看

  • 为什么 double 优于 float? https://stackoverflow.com/q/22818382/995714
  • 我应该使用双精度还是浮点? https://stackoverflow.com/q/1074474/995714
  • 什么时候用float,什么时候用double https://softwareengineering.stackexchange.com/q/188721/98103

However 小于 32 位的浮点数确实存在 https://en.wikipedia.org/wiki/Minifloat。它们主要用于storage例如在图形中,每像素 96 位(每通道 32 位 * 3 个通道)太浪费了,并且将转换为正常的 32 位浮点数进行计算(某些特殊硬件上除外)。各种各样的10、11、14 位浮点类型 https://www.khronos.org/opengl/wiki/Small_Float_Formats存在于OpenGL中。许多 HDR 格式对每个通道使用 16 位浮点,而 Direct3D 9.0 以及 Radeon R300 和 R420 等一些 GPU 则采用 24 位浮点格式。还支持 24 位浮点数一些 8 位微控制器中的编译器 https://microchipdeveloper.com/c:understanding-floating-point-representations like PIC https://stackoverflow.com/q/26930117/995714其中 32 位浮点支持成本太高。 8 位或更窄的浮点类型用处不大,但由于其简单性,它们经常在计算机科学课程中教授。此外,还使用了一个小浮球ARM的指令编码 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/CJAEFGHE.html对于小浮点立即数。

The IEEE 754-2008 修订版 https://en.wikipedia.org/wiki/IEEE_754正式添加了 16 位浮点格式,A.K.Abinary16 or 半精度 https://en.wikipedia.org/wiki/Half-precision_floating-point_format,带有 5 位指数和 11 位尾数

一些编译器支持 IEEE-754 二进制 16,但主要用于转换或向量化操作,而不是计算(因为它们不够精确)。例如ARM的工具链有__fp16 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491f/CHDCJAEC.html可以在 2 种变体之间进行选择:IEEE 和替代,具体取决于您是否需要更多范围或 NaN/inf 表示。GCC https://gcc.gnu.org/onlinedocs/gcc/Half-Precision.html and Clang https://clang.llvm.org/docs/LanguageExtensions.html#half-precision-floating-point也支持__fp16以及标准化名称_Float16. See 如何在 x86_64 的 gcc 上启用 __fp16 类型 https://stackoverflow.com/q/45108628/995714

最近由于人工智能的兴起,另一种格式称为bfloat16 https://en.wikipedia.org/wiki/Bfloat16_floating-point_format (大脑浮点格式 https://en.wikichip.org/wiki/brain_floating-point_format)这是一个简单截断IEEE-754 二进制32 的前 16 位变得常见

减少尾数背后的动机源自谷歌的实验,该实验表明,只要仍然可以将接近于零的微小值表示为训练期间微小差异总和的一部分,就可以减少尾数。较小的尾数带来了许多其他优势,例如减少乘法器功率和物理硅面积。

  • float32: 242=576 (100%)
  • float16: 112=121 (21%)
  • bfloat16: 82=64 (11%)

许多编译器喜欢 and 现在还获得了支持 bfloat16 的能力

有关 bfloat16 的更多信息:

  • bfloat16 - 硬件数值定义 https://software.intel.com/en-us/download/bfloat16-hardware-numerics-definition
  • 将 bfloat16 与 TensorFlow 模型结合使用 https://cloud.google.com/tpu/docs/bfloat16
  • 什么是 tf.bfloat16“截断的 16 位浮点”? https://stackoverflow.com/q/44873802/995714

如果 bfloat16 不够用,还会出现一种新的 19 位类型,称为张量浮点数 https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么没有 2 字节浮点并且已经存在实现? 的相关文章

  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • NHibernate 忽略长度属性

    运行 SQL Profiler 后 我意识到 NHibernate 正在将字符串映射到nvarchar 4000 我通过指定修复了它type AnsiString and length 在 hbm 文件中 现在正在生成varchar 800
  • .gitlab-ci.yml yaml 内的数组变量

    我想在 gitlab ci cd yml 文件的变量中使用数组 如下所示 variables myarrray abc dcef script echo myarray 0 myarray 1 但 Lint 告诉我该文件不正确 variab
  • 如何使用 Angular4 进行 Codeigniter 视图?

    首先 我的 PHP Codeigniter 项目当前在服务器上运行 然后我在服务器上安装了最新的 Angular4 CLI Typescript 但我不知道如何与Codeigniter项目集成 如何像 AngularJS 一样在 Codei
  • 更改滚动时的 div 不透明度

    我怎样才能做到当你向下滚动页面时 下一个 DIV 会在前一个 DIV 之上淡出 我设置了这个小提琴来更好地说明它 http jsfiddle net meEf4 176 http jsfiddle net meEf4 176 例如 如果您位
  • 如何知道 Azure 函数是否正在插槽中运行

    函数可以知道它是否在槽中运行吗 我想阻止某个函数在 暂存 槽中执行 Updated 根据布鲁斯的回答 再次感谢朋友 我写了那篇博文http www frankysnotes com 2017 09 how to know when azur
  • 使用 tabLayout 时如何更改所选选项卡的文本样式?

    我想让选定选项卡的文本变为粗体 我怎样才能通过 xml 或 java 代码来做到这一点 无论哪种更容易 我稍微更改了上面建议的答案 它对我来说非常有用 不需要额外的 xml 文件 希望它会有所帮助 for int i 0 i lt tabL
  • Swift iOS 9.2 中的每日本地通知

    尝试快速发送每日本地通知 然而 由于某种原因 它只是每分钟发送一次 我希望第一个通知在应用程序打开后 30 分钟发送 然后每天重复此通知 在 swift fie 中我有以下代码 每日通知代码 同时在应用程序委托中添加部分 让 Date NS
  • 如何将 JTable 中的数据导出到 CSV

    我只是在启动一些代码从 JTable 中提取值时遇到问题 以便最终可以将它们作为 CSV 文件在 Excel 上查看 目前我有一个使用以下代码创建的 JTable package com alpha import javax swing i
  • 将 MIME 编码的附件发布到 Ariba Supply Network 时出现问题

    我在尝试使用 VB NET 和 WebRequest 对象发布一些 cXML 文本和附件时遇到问题 我相信我正在格式化我希望正确发布的数据文本 因为它与 Ariba 提供的示例相匹配 我不确定的是我是否正确使用 WebRequest 对象来
  • 启用远程访问neo4j 4.2社区版

    由于在家工作 我需要一种方法来监视远程 neo4j 实例 最好通过 Web 浏览器实例 在过去 例如在3 0中 它可以通过以下方式轻松实现修改单个配置行 https neo4j com developer kb how do i enabl
  • 如何动态更改JList中所选项目的背景颜色

    如何动态更改 JList 中选择的项目的背景颜色 像下面这样的东西应该有助于作为起点 public class SelectedListCellRenderer extends DefaultListCellRenderer Overrid
  • 如何为 Jsoup 添加代理支持?

    我是 Java 初学者 我的第一个任务是解析大约 10 000 个 URL 并从中提取一些信息 为此我正在使用Jsoup并且运行良好 但现在我想为其添加代理支持 代理也有用户名和密码 您可以轻松设置代理 System setProperty
  • 从 MVC 视图中的模型访问 displayName 属性

    如果我的模型有 DisplayName First Name public string firstName get set 然后我可以用 LabelFor 在视图中打印它 Html LabelFor model gt model acc
  • Rails 4 - 将地址保存为数据库中的一列

    我是 Rails 新手 正在开发一个简单的应用程序 我的 ERD 中有一个名为 Client 的模型 并且希望保存每个客户的地址 我最初的想法是将地址保存为单独的字段 即 rails g model Client address first
  • 提交表单后重定向是一个好习惯吗?

    我最近开始在提交网站上的某些表单 主要与购物车应用程序相关 后进行 header 重定向 到同一页面 以便用户不会通过刷新页面来执行意想不到的操作或者 后退 或 前进 并刷新页面 这是可以接受的做法吗 这是标准做法 称为redirect a
  • 我有*很多*源文件要添加到 git 存储库,如何使其快速

    我在看here https git scm com docs git fast import寻找更快地将批量文件导入 git 存储库的灵感 但不确定是不是这样 基本上情况是 我有超过 1 亿个文件想要提交到 git 存储库 我已将它们分解为
  • sqlalchemy 的 row_to_json 语法

    我想弄清楚如何将 Postgres 9 2 row to json 与 SqlAlchemy 一起使用 但是我无法想出任何有效的语法 details foo row q select Foo where Foo bar id Bar id
  • Android 进度不相应地工作

    我是 Android 和 Java 新手 我一直在从事我的任务 即图像下载器 我必须下载带有进度条的图像并将其显示在网格中 我创建了两个类 1 URL图像适配器 2 缓存活动 一切正常 但在我单击下载按钮之前下载就开始了 当我单击下载按钮时
  • 在 Grails 中使用 AOP 不适用于服务

    我使用 Grails 2 2 3 并在 grails app conf spring resources groovy 中键入以下代码 beans xmlns aop http www springframework org schema
  • 为什么没有 2 字节浮点并且已经存在实现?

    假设我真的内存不足并且想要更小的范围 类似于short vs int 着色器语言已经支持half对于半精度的浮点类型 不仅仅是来回转换使值在 1 和 1 之间 即返回一个像这样的浮点数 shortComingIn maxRangeOfSho