浮点数的由来及运算解析

数学是自然科学的皇后,计算机的设计初衷是科学计算。计算机的最基本功能是需要存储整数、实数,及对整数和实数进行算术四则运算。

但是在计算机从业者的眼中,我们知道的数学相关的基本数据类型通常是整型、浮点型、布尔型。整型又分为int8(用8位表示的整数)、uint8(用8位表示的无符号整数)、int16、uint16、int32、uint32,浮点型又分为float16(半精度,FP16)、float32(单精度)、float64(双精度)。今天,我们就来聊聊浮点数。

#1 为什么叫浮点数?

由于实数在计算机中的表示方法是以小数点浮动的方式表示的,所以称之为浮点数。

1、计算机中的整数表示

众所周知,计算机最底层是二进制计数。用二进制数表示整数很简单(本文不考虑原码、反码、补码,也不考虑大端模式和小端模式),最高位表示符号位,0表示正数,1表示负数,余下的位表示二进制值。

int8即使用8位表示的整数,最高位用来表示正负符号,还有7位表示数字,其所能表示的范围是[-128,127]。有人可能会想,00000000表示正0,10000000表示负0,int8表示的范围岂不是[-128,127]吗?但用两个序列表示同一个数,这本身就是一种浪费。如果计算机从最底层就开始这样浪费,那还了得?所以节约资源,从我做起。

2、用定点数来表示实数

最高位表示符号,然后再约定整数占几位,余下的位都是小数。从另一个角度来说,即小数点的位置是固定的。优点是计算很方便,缺点是存储的数据范围有限。

3、用浮点数来表示实数

最高位表示符号,再约定一部分二进制位表示指数域,余下的是数域。优点是能表示的数据范围很大,缺点是计算慢。但是80286出现后,有了浮点协处理数(FPU),浮点数表示方式成为了主流。

IEEE-754是IEEE制定的二进制浮点数算术标准(IEEE即电气与电子工程师协会,这个协会制定了很多计算机领域的标准),也计算机中表示浮点数的行业标准,于1985年正式采用,2008年和2019年又分别进行了完善和修订。

题外话

我司首席科学家金耀初教授,就是现任IEEE计算智能协会主席。计算智能协会是IEEE下设的39个专业学会之一,目前是会员约9000人,是IEEE唯一以人工智能、计算智能为主要研究领域的学会。

我们以最常见的64位、32位、16位浮点数为例,如下图所示:

添加图片注释,不超过 140 字(可选)

FP64称为双精度浮点数,一共64位,1位表示正负符号,11位表示指数,52位表示小数,可表达的精度范围是:

FP32是我们最常用的浮点数,也称为单精度浮点数,一共32位,1位表示正负符号,8位表示指数,23位表示小数,可表达的精度范围是:

FP16称为半精度浮点数,一共16位,1位表示正负符号,5位表示指数,10位表示小数,可表达的数据范围是:

添加图片注释,不超过 140 字(可选)

我们再以最简单的16位浮点数为例,如下图所示:

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

互联网上有一些很有意思的网页,能帮我们更深刻的认识到浮点数。我们挑选了由纽约市立大学计算机科学系提供的网页,网址为https://babbage.cs.qc.cuny.edu/ieee-754.old/decimal.html(或者也可以打开https://baseconvert.com/ieee-754-floating-point)。

添加图片注释,不超过 140 字(可选)

接下来,我们随机输入一个浮点数,例如38.375,然后点击Rounded,再看看其在计算机中是如何表达的。

添加图片注释,不超过 140 字(可选)

  • 最高位是31位(位序从0开始),此处为0,表示是正数

  • 接下来是指数域,从30位到23位一共是8位,最大能表示的数是256,最小能表示的数是0

  • 指数域的值要减掉127,此处指数域是10000100,即132-127=5

  • 余下的都是尾数域,从22位到0位一共是23位,此处是1.00110011(小数点前面的1是最终的32位数据里不存在的,因为尾数规范化后都是以1开始,所以这个1都是省略的)

最高位好理解,但是指数域5和尾数域的1.00110011是怎么得到38.375的?请各位先思考一下再看下面的计算过程。

添加图片注释,不超过 140 字(可选)

移动数域的小数点位置,这个操作是不是浮点?我认为,这就是浮点数的由来。

接下来还有一个很有意思的问题,即浮点数的精度问题。以0.3这个数为例,我们输入0.3后,分别点击Not Rounded和Rounded(因为这里是二进制数,不适合翻译为四舍五入,所以我用原单词替代),分别得到如下两图:

Not Rounded模式下

Not Rounded模式下,数域为1 .00110011001100110011001,最终计算得到的十进制数是0.299999总是比0.3小一点点。

为什么会这样?因为十进制的有穷数0.3,转换为二进制数后是一个无穷数(1001无限循环),如果直接扔掉后面的数,那么最终转换后的十进制数据就会少了一点点,变成了0.29999999。

Rounded模式下

Rounded模式下,数域为1 .00110011001100110011010,也就是向前进了一位,这样最终得到的数变成了0.30000001,即比实际的十进制数0.3大了一点点。

所以在实际编程中,不建议对浮点数数据直接进行等值比较,一般使用区域比较,因为浮点数存在精度问题。c/c++程序员们遇到的问题0.1 + 0.2 = 0.30000000000000004也是这个原因导致的。

#2 BF16(Brain Float)

BF16是一种全新的浮点数格式,专门服务于人工智能和深度学习,最开始是Google Brain发明并应用在TPU上的,后来Intel,Arm及一众头部公司都在广泛使用。

BF16也是用16位来表示浮点数,但是是用8位表示指数,用7位表示小数,此时BF16表示的整数范围和FP32是一样的,小数部分则存在着很大的误差。

以前大部分的AI训练都使用FP32,但有相关的论文证明,在深度学习中降低数字的精度可以减少tensor相乘所带来的运算功耗,且对结果的影响却并不是非常大,且更少的尾数也使它能够拥有更小的芯片面积。因此在模型越来越大、计算越来越密集的人工智能领域,BF16也得到了广泛的应用。

#3 模型量化及INT8

从数据在计算机上的表示来看,整数运算比浮点数运算要快很多。而训练一个深度神经网络模型得到的参数通常都是FP32类型的,我们将其部署到终端NPU上时,通常需要将其量化为8位整数(即int8或者uint8)。

为什么人工神经网络模型要量化?因为终端的算力、资源都是有限的,量化后有如下好处:

  • 减小了模型尺寸。原有的一个参数如果是32位表示的实数,量化后用8位整数来表示,这样模型能缩小至原模型大小的四分之一;

  • 降低了内存和存储占用;

  • 降低了功耗;

  • 提升了计算速度。

这些特点都能有效地帮助模型部署在终端设备上,虽然量化会带来一些精度上的损失,但通过良好的量化算法和设计有效的算子,量化后的模型在终端上能够拥有接近云端模型的准确率,同时能极大节约云端算力和网络传输成本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/326156.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给centos机器打个样格式化挂载磁盘(新机器)

文章目录 一、先安装lvm2二、观察磁盘三、磁盘分区四、建PV五、建VG六、创建LV七、在LV上创建文件系统八、挂载到/home(1)临时挂载(2)永久挂载 九、最后reboot一下 一、先安装lvm2 yum install lvm2二、观察磁盘 三、磁盘分区 四…

Springboot整合 Spring Cloud Alibaba Seata

1.事务简介 事务是访问并可能更新数据库中各种数据项的一个程序执行单元。在关系型数据库中,一个事务由一组sql语句组成。事务具有 原子性,一致性,隔离性,持久性四个属性(ACID)。 原子性:事务是一个不可分割的工作单位…

ThreadLocal 源码详解

概述 ThreadLocal是一个java提供的本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作…

美国政府首次发布《国家网络安全态势报告》

报告提到,不断演变的关键基础设施风险、勒索软件、供应链利用、商业间谍软件和AI是主要趋势;国家网络总监办公室同时公布了第二版《国家网络安全战略实施计划》,新增了31项倡议。 前情回顾美国深化网络安全战略 美国发布国家网络安全战略实施…

快团团怎么做帮卖团长/供货大团长(如何从小白到优质团长)?

一名小白想要成长为快团团的优质团长,可以遵循以下步骤和策略: 了解平台与注册成为团长: 首先,熟悉快团团平台的操作流程和规则。快团团是一个基于微信的小程序,专注于社区团购业务。通过微信扫描团长资源二维码或在快…

【爬虫基础1.1课】——requests模块上

目录索引 requests模块的作用:实例引入: 特殊情况:锦囊1:锦囊2: 这一个栏目,我会给出我从零开始学习爬虫的全过程。感兴趣的小伙伴可以关注一波,用于复习和新学都是不错的选择。 那么废话不多说&#xff0c…

​​​​【收录 Hello 算法】5.2 队列

目录 5.2 队列 5.2.1 队列常用操作 5.2.2 队列实现 1. 基于链表的实现 2. 基于数组的实现 5.2.3 队列典型应用 5.2 队列 队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即…

利用香港多IP服务器进行大数据分析的潜在优势?

利用香港多IP服务器进行大数据分析的潜在优势? 在当今数据驱动的时代,大数据分析已经成为企业获取竞争优势的不二选择。而香港作为一个拥有世界级通信基础设施的城市,提供了理想的环境来部署多IP服务器,从而为大数据分析提供了独特的优势。…

2024中国(重庆)人工智能展览会8月举办

2024中国(重庆)人工智能展览会8月举办 邀请函 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位: 重庆港华展览有限公司 【报名I59交易会 2351交易会 9466】 展会背景: 2024中国航空科普大会暨第八届全国青少年无人机大赛在…

Spring Framework-简介

Spring Framework Java Spring是一个开源的Java应用框架,它的主要目的是简化企业级应用开发的复杂性。Spring框架为开发者提供了许多基础功能,使得开发者能够更专注于业务逻辑的实现,而不是底层的细节。 主要特点和功能: 控制反…

数据库脚本编写规范(SQL编写规范)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目 2 SQL书写规范 3 SQL编写原则 软件开发全文档获取:点我获取

全域运营是割韭菜吗?看完再下结论!

随着流量时代的到来,各大公私域平台中的流量争夺战日益激烈,商家和品牌实现流量变现的难度值也不断提高,运营人员的压力也逐渐增大。在此背景下,全域运营的兴起或许是一个契机,能够将所有人从内卷的状态中解救出来。而…

网络安全之OSPF进阶

该文针对OSPF进行一个全面的认识。建议了解OSPF的基础后进行本文的一个阅读能较好理解本文。 OSPF基础的内容请查看:网络安全之动态路由OSPF基础-CSDN博客 OSPF中更新方式中的触发更新30分钟的链路状态刷新。是因为其算法决定的,距离矢量型协议是边算边…

力扣刷题 day1

移动零 283. 移动零 - 力扣(LeetCode) 看到这道题,是否第一个想法就是双指针,下面我们就来使用双指针来完成这道题. 图: 代码: java: // 移动 0 双指针public void moveZeroes(int[] nums) {for (int current 0, dest -1; …

前端框架 Vue 主要用来做什么的?

Vue.js 是一个流行的前端框架,主要用于构建交互式的用户界面。它的设计目标是通过简单的 API 提供高效的数据驱动视图层。Vue 具有响应式数据绑定和组件化的特性,使得开发者可以轻松地构建复杂的单页面应用 (SPA) 和动态网页。 1. 数据驱动视图 Vue 的…

Matlab如何导出高质量论文插图?科研效率UpUp第8期

当你用Matlab绘制了一张论文插图: 想要所见即所得,原封不动地将其保存下来,该怎么操作呢? 虽说以前总结过7种方法(Matlab导出论文插图的7种方法),但要说哪一种可以满足上面的要求,想…

socket实现TCP UDP

1、socket通信建立流程 1.1、创建服务端流程 使用 socket 函数来创建 socket服务。 使用 bind 函数绑定端口。 使用 listen 函数监听端口。 使用 accept 函数接收客户端请求。 1.2、创建客户端流程 使用 socket 函数来创建 socket 服务。 使用 connect 函数连接到 socke…

TypeError: can only concatenate str (not “int“) to str

TypeError: can only concatenate str (not "int") to str a 窗前明月光,疑是地上霜。举头望明月,低头思故乡。 print(str_len len(str_text) : len(a)) 试图打印出字符串 a 的长度,但是在 Python 中拼接字符串和整数需要使用字符…

邮件代发邮箱API发送邮件时如何正确使用?

邮件代发API发送邮件如何使用?邮件代发的注意事项? 邮件代发邮箱API作为邮件发送的自动化工具,其正确使用对于提高工作效率、保障信息安全具有重要意义。下面,AokSend就来探讨一下在使用邮件代发邮箱API发送邮件时,应…

【Linux学习笔记】一篇文章彻底搞定 “Linux同步与互斥“ !

本章重点 1. 学会线程同步。 2 学会使用互斥量,条件变量,posix信号量,以及读写锁。 1、进程线程间的互斥相关背景概念 临界资源:多线程执行流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的…