浮点数格式 (参考1参考2

浮点数是一种用二进制表示的实数,它由三个部分组成:sign(符号位)、exponent(指数位)和fraction(小数位)。不同的浮点数格式有不同的位数分配给这三个部分,从而影响了它们能表示的数值范围和精度。例如:

下面是一些常见的浮点数格式的介绍:

  • FP64(双精度浮点数):用64位二进制表示,其中1位用于sign,11位用于exponent,52位用于fraction。它的数值范围大约是2.23e-308到1.80e308,精度大约是15到17位有效数字。它通常用于科学计算中对精度要求较高的场合,但在深度学习中不常用,因为它占用的内存和计算资源较多。
  • FP32(单精度浮点数):用32位二进制表示,其中1位用于sign,8位用于exponent,23位用于fraction。它的数值范围大约是1.18e-38到3.40e38,精度大约是6到9位有效数字。它是深度学习中长期使用的标准格式,因为它能平衡数值范围和精度,同时也有较好的硬件支持。
  • FP16(半精度浮点数):用16位二进制表示,其中1位用于sign,5位用于exponent,10位用于fraction。它的数值范围大约是6.10e-5到6.55e4,精度大约是3到4位有效数字。它是近年来在深度学习中越来越流行的格式,因为它能节省内存和计算资源,同时也有张量核心(Tensor Core)等专门的硬件加速器。但它的缺点是数值范围和精度较低,可能导致数值溢出或下溢的问题。
  • BFLOAT16(Brain Floating Point 16):用16位二进制表示,其中1位用于sign,8位用于exponent,7位用于fraction。它的数值范围和FP32相同,但精度只有2位有效数字。它是由Google提出的一种针对深度学习优化的格式,它的优点是能保持和FP32相同的数值范围,从而避免数值溢出或下溢的问题,同时也能节省内存和计算资源,提高训练速度。它的缺点是精度较低,可能导致数值不稳定或精度损失的问题。
  • TF32(TensorFloat 32):用32位二进制表示,其中1位用于sign,8位用于exponent,10位用于fraction,剩余的13位被忽略。它的数值范围和FP32相同,但精度只有3到4位有效数字。它是由NVIDIA在Ampere架构中推出的一种专为深度学习设计的格式,它的优点是能保持和FP32相同的数值范围,同时也能利用张量核心(Tensor Core)等专门的硬件加速器,提高训练速度。它的缺点是精度较低,可能导致数值不稳定或精度损失的问题。

浮点数的计算方式 (详细):

  浮点数是一种用二进制表示的实数,它由三个部分组成:sign(符号位)、exponent(指数位)和fraction(小数位)。不同的浮点数格式有不同的位数分配给这三个部分,从而影响了它们能表示的数值范围和精度。

例如:FP16:

  • Sign(符号位): 1 位,0表示整数;1表示负数。
  • Exponent(指数位):5位,简单地来说就是表示整数部分,范围为00001(1)到11110(30),正常来说整数范围就是 $2^{1}−2^{30}$  ,但其实为了指数位能够表示负数,引入了一个偏置值,偏置值是一个固定的数,它被加到实际的指数上,在二进制16位浮点数中,偏置值是 15。这个偏置值确保了指数位可以表示从-14到+15的范围即 $2^{−14}−2^{15}$ ,而不是1到30,注:当指数位都为00000和11111时,它表示的是一种特殊情况,在IEEE 754标准中叫做非规范化情况,后面可以看到这种特殊情况怎么表示的。
  • Fraction(尾数位):10位,简单地来说就是表示小数部分,存储的尾数位数为10位,但其隐含了首位的1,实际的尾数精度为11位,这里的隐含位可能有点难以理解,简单通俗来说,假设尾数部分为1001000000,为默认在其前面加一个1,最后变成1.1001000000然后换成10进制就是:
# 第一种计算方式
1.1001000000 = 1 * 2^0 + 1 * 2^(-1) + 0 * 2^(-2) + 0 * 2^(-3) + 1 * 2^(-4) + 0 * 2^(-5) + 0 * 2^(-6) + 0 * 2^(-7) + 0 * 2^(-8) + 0 * 2^(-9) = 1.5625
# 第二种计算方式
1.1001000000 = 1 + 576(1001000000变成10进制)/1024 = 1.5625

浮点数格式:FP64, FP32, FP16, BFLOAT16, TF32之间的相互区别的更多相关文章

  1. 使用TensorRT对caffe和pytorch onnx版本的mnist模型进行fp32和fp16 推理 | tensorrt fp32 fp16 tutorial with caffe pytorch minist model

    本文首发于个人博客https://kezunlin.me/post/bcdfb73c/,欢迎阅读最新内容! tensorrt fp32 fp16 tutorial with caffe pytorch ...

  2. C#中将long浮点数格式化为{H:min:s.ms}格式的字符串的方法

    场景 表示时间的数据格式为浮点数,如下: 需要将其格式化为{H:min:s.ms}格式的字符串,效果如下: 注: 博客主页:https://blog.csdn.net/badao_liumang_qi ...

  3. DIV与SPAN之间有什么区别

    DIV与SPAN之间有什么区别 DIV 和 SPAN 元素最大的特点是默认都没有对元素内的对象进行任何格式化渲染.主要用于应用样式表(共同点). 两者最明显的区别在于DIV是块元素,而SPAN是行内元 ...

  4. C#与Javascript变量、函数之间的相互调用

    原文地址:http://blog.csdn.net/wonsoft/article/details/2595743 C#与Javascript变量.函数之间的相互调用  一.javascript调用C ...

  5. Http、Socket、WebSocket之间联系与区别

    WebSocket和Socket区别 可以把WebSocket想象成HTTP(应用层),HTTP和Socket什么关系,WebSocket和Socket就是什么关系. HTTP 协议有一个缺陷:通信只 ...

  6. 别名现象,java对象之间的相互赋值

    请看一下代码 import java.util.*; class book{ static  int c = null; } public static void main(String[] args ...

  7. <%@page include%>、<%@include%>、<jsp:include>三者之间的本质区别

    <%@page include%>.<%@include%>.<jsp:include>三者之间的本质区别 先从它的几个内置对象说起. application和se ...

  8. JAVA和C/C++之间的相互调用。

    在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用. Java Native Interface (JNI)标准是java平台的一部分 ...

  9. 不同版本PHP之间cURL的区别(-经验之谈)

    之前在做一个采集的工具,实现采集回来的文章,图片保存起来.文章内容是保存在数据库,图片是先需要上传到图片服务器,再返回图片地址,替换掉文章的图片地址. 问题来了:都能成功采集都东西,但是,本地测试是正 ...

  10. Exception和IOException之间的使用区别

    Exception和IOException之间的使用区别 先看一段代码.这段代码来自<深入剖析tomcat>   public void await() { // 创建ServerSock ...

随机推荐

  1. zabbix API笔记

    python简单demo 输出id为111主机的主机群组信息 import requests import json request_headers = {"Content-Type&quo ...

  2. Solution Set - DP

    CF101E Candies and Stones Link&Submission. DP 的状态设计和转移都是显然的,唯一的问题在于需要输出方案,而这题卡空间.会发现如果用 bitset 存 ...

  3. jemeter中json提取器

    1.A接口中的单个参数提取,之后用于其他接口 a. 在需要提取字段的接口上右击添加----后置处理器-----json extractor b. 填写json提取器的数据 1.名称:随便填写,方便自己 ...

  4. Golang、python中MD5、SHA512、base64编码等

    在GO中处理的话,比较方便. func main() { fmt.Println(md5Str("woGo")) fmt.Println(sha512Str("woGo& ...

  5. python教程6.3-time模块datetime模块

     由于time是基于Unix Timestamp,所以其所能表述的日期范围被限定在 1970 – 2038 之间.因此2038年后就不能用time了,建议使用datetime. time模块 有下面几 ...

  6. cesium教程2-加载显示地形地图

    上面地形数据,是调用cesium官方的地图服务,需要先注册cesium账户,配置cesium的账户token才行 1.在线地形服务的示例代码如下 <!DOCTYPE html> <h ...

  7. 高性能远程桌面Splashtop 居家办公首选软件

    2020年,新冠疫情期间,各地提倡远程办公.居家办公.在家里怎么使用办公室的电脑?以Splashtop为代表的远程桌面控制软件也就被越来越多的人知晓和使用了. 什么是Splashtop远程桌面? Sp ...

  8. 数据库—SQL语言学习

    文章目录 SQL 数据类型 重要的关键字 定义数据库 数据库的文件 table创建与删除 表的定义 表的alter 表的删除 视图 定义视图 删除视图 更新视图 插入视图 视图总结 索引 SQL单表查 ...

  9. 移动通信网络中的 3A 实现

    目录 文章目录 目录 3A RADIUS Diameter 基本概念 基本协议 应用协议 freeDiameter 3A AAA,即认证(Authentication).授权(Authorizatio ...

  10. 【c++】const 限定符

    #include <iostream> int main() { using namespace std; cout << "Hello World!\n" ...