浮点数格式:FP64, FP32, FP16, BFLOAT16, TF32之间的相互区别
浮点数是一种用二进制表示的实数,它由三个部分组成: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之间的相互区别的更多相关文章
- 使用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 ...
- C#中将long浮点数格式化为{H:min:s.ms}格式的字符串的方法
场景 表示时间的数据格式为浮点数,如下: 需要将其格式化为{H:min:s.ms}格式的字符串,效果如下: 注: 博客主页:https://blog.csdn.net/badao_liumang_qi ...
- DIV与SPAN之间有什么区别
DIV与SPAN之间有什么区别 DIV 和 SPAN 元素最大的特点是默认都没有对元素内的对象进行任何格式化渲染.主要用于应用样式表(共同点). 两者最明显的区别在于DIV是块元素,而SPAN是行内元 ...
- C#与Javascript变量、函数之间的相互调用
原文地址:http://blog.csdn.net/wonsoft/article/details/2595743 C#与Javascript变量.函数之间的相互调用 一.javascript调用C ...
- Http、Socket、WebSocket之间联系与区别
WebSocket和Socket区别 可以把WebSocket想象成HTTP(应用层),HTTP和Socket什么关系,WebSocket和Socket就是什么关系. HTTP 协议有一个缺陷:通信只 ...
- 别名现象,java对象之间的相互赋值
请看一下代码 import java.util.*; class book{ static int c = null; } public static void main(String[] args ...
- <%@page include%>、<%@include%>、<jsp:include>三者之间的本质区别
<%@page include%>.<%@include%>.<jsp:include>三者之间的本质区别 先从它的几个内置对象说起. application和se ...
- JAVA和C/C++之间的相互调用。
在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用. Java Native Interface (JNI)标准是java平台的一部分 ...
- 不同版本PHP之间cURL的区别(-经验之谈)
之前在做一个采集的工具,实现采集回来的文章,图片保存起来.文章内容是保存在数据库,图片是先需要上传到图片服务器,再返回图片地址,替换掉文章的图片地址. 问题来了:都能成功采集都东西,但是,本地测试是正 ...
- Exception和IOException之间的使用区别
Exception和IOException之间的使用区别 先看一段代码.这段代码来自<深入剖析tomcat> public void await() { // 创建ServerSock ...
随机推荐
- 2018-8-10-WPF-如何画出1像素的线
title author date CreateTime categories WPF 如何画出1像素的线 lindexi 2018-08-10 19:16:53 +0800 2018-2-13 17 ...
- 基于权电阻网络的VGA色条显示#DE10-lite#verilog#qp
- Linux下ffmpeg库的编译链接
/usr/bin/ld: /usr/local/ffmpeg/lib/libavformat.a(aviobuf.o): in function `ff_crc04C11DB7_update':/ho ...
- ETSI GS MEC 012,无线网络信息服务 API
目录 文章目录 目录 版本 功能理解 版本 ETSI GS MEC 012 V2.1.1 (2019-12) 功能理解 RNIS(Radio Network Information Service,无 ...
- 2024-05-18:用go语言,给定一个从 0 开始的字符串 s,以及两个子字符串 a 和 b,还有一个整数 k。 定义一个“美丽下标”,当满足以下条件时: 1.找到字符串 a 在字符串 s 中的位
2024-05-18:用go语言,给定一个从 0 开始的字符串 s,以及两个子字符串 a 和 b,还有一个整数 k. 定义一个"美丽下标",当满足以下条件时: 1.找到字符串 a ...
- 记一次 .NET某酒店后台服务 卡死分析
一:背景 1. 讲故事 停了一个月没有更新文章了,主要是忙于写 C#内功修炼系列的PPT,现在基本上接近尾声,可以回头继续更新这段时间分析dump的一些事故报告,有朋友微信上找到我,说他们的系统出现了 ...
- linux time测试命令的运行时间
在linux中,time命令是用来测试命令的运行时间的,命令的运行时间有三种: real:实际使用时间,该时间包括进程执行时实际使用的 CPU 时间,进程耗费在阻塞上的时间(如等待完成 I/O 操 ...
- linux下常用的快捷键和$参数
1.下面介绍两个在linux下非常有用的$参数 2.!$ 表示引用上一个命令的最后一个参数,例子如下: [root@node5 ~]# echo '!$的作用是引用上一个命令的最后一个参数' > ...
- .net程序员学习java篇一(搭建SSM)
一.安装IDE 相比于.net环境的一气呵成,java可能麻烦一点,这里记录下来,避免萌新踩坑 1.1安装JDK,这里不要玩什么花哨,老老实实选个大众版(Oracle JDK1.8x),设置环境变量, ...
- Windows Server 2022 NTP服务器
一.配置NTP服务器 配置NTP服务器,为客户端提供时间同步服务. 如果计算机是Active Directory域控制器,则NTP服务器功能已自动启动. 因此,下面的示例是计算机在工作组环境中启用NT ...