-
整数、单精度浮点数和双精度浮点数在计算机中的存储格式
2015-10-19 18:48:51 -
python单精度和双精度_单精度、双精度、多精度和混合精度计算的区别是什么?...
2020-12-03 23:22:51编排 | strongerHuang微信公众号|嵌入式专栏我们学过数学,都知道有理数和无理数,然后在有理数中有一类叫浮点数的...下面就来讲讲关于浮点数中,单精度、双精度、多精度和混合精度计算的区别。嵌入式专栏1关于圆周...点击上方“大鱼机器人”,选择“置顶/星标公众号”
福利干货,第一时间送达!
编排 | strongerHuang
微信公众号 | 嵌入式专栏
我们学过数学,都知道有理数和无理数,然后在有理数中有一类叫浮点数的数字,不知道大家对这些还有没有印象?
在软件编程的时候,我们也会用到浮点数,一种既包含小数又包含整数的数据类型。
下面就来讲讲关于浮点数中,单精度、双精度、多精度和混合精度计算的区别。
嵌入式专栏
1
关于圆周率 π
我们提到圆周率 π 的时候,它有很多种表达方式,既可以用数学常数3.14159表示,也可以用一长串1和0的二进制长串表示。
圆周率 π 是个无理数,既小数位无限且不循环。因此,在使用圆周率进行计算时,人和计算机都必须根据精度需要将小数点后的数字四舍五入。
在小学的时候,小学生们可能只会用手算的方式计算数学题目,圆周率的数值也只能计算到小数点后两位——3.14;而高中生使用图形计算器可能会使圆周率数值排到小数点后10位,更加精确地表示圆周率。在计算机科学中,这被称为精度,它通常以二进制数字来衡量,而非小数。
对于复杂的科学模拟,开发人员长期以来一直都依靠高精度数学来研究诸如宇宙大爆炸,或是预测数百万个原子之间的相互作用。
数字位数越高,或是小数点后位数越多,意味着科学家可以在更大范围内的数值内体现两个数值的变化。
借此,科学家可以对最大的星系,或是最小的粒子进行精确计算。
但是,计算精度越高,意味着所需的计算资源、数据传输和内存存储就越多。其成本也会更大,同时也会消耗更多的功率。
由于并非每个工作负载都需要高精度,因此 AI 和 HPC 研究人员可以通过混合或匹配不同级别的精度的方式进行运算,从而使效益最大化。NVIDIA Tensor Core GPU 支持多精度和混合精度技术,能够让开发者优化计算资源并加快 AI 应用程序及其推理功能的训练。
嵌入式专栏
2
单精度、双精度和半精度浮点格式之间的区别
IEEE 浮点算术标准是用来衡量计算机上以二进制所表示数字精度的通用约定。在双精度格式中,每个数字占用64位,单精度格式占用32位,而半精度仅16位。
要了解其中工作原理,我们可以拿圆周率举例。在传统科学记数法中,圆周率表示为3.14 x100。但是计算机将这些信息以二进制形式存储为浮点,即一系列的1和0,它们代表一个数字及其对应的指数,在这种情况下圆周率则表示为1.1001001 x 21。
在单精度32位格式中,1位用于指示数字为正数还是负数。指数保留了8位,这是因为它为二进制,将2进到高位。其余23位用于表示组成该数字的数字,称为有效数字。
而在双精度下,指数保留11位,有效位数为52位,从而极大地扩展了它可以表示的数字范围和大小。半精度则是表示范围更小,其指数只有5位,有效位数只有10位。
圆周率在每个精度级别表现如下:
嵌入式专栏
3
多精度和混合精度计算的差异
多精度
计算意味着使用能够以不同精度进行计算的处理器,在需要使用高精度进行计算的部分使用双精度,并在应用程序的其他部分使用半精度或单精度算法。
混合精度(也称为超精度)计算则是在单个操作中使用不同的精度级别,从而在不牺牲精度的情况下实现计算效率。
在混合精度中,计算从半精度值开始,以进行快速矩阵数学运算。但是随着数字的计算,机器会以更高的精度存储结果。例如,如果将两个16位矩阵相乘,则结果为32位大小。
使用这种方法,在应用程序结束计算时,其累积得到结果,在准确度上可与使用双精度算法运算得到的结果相媲美。
这项技术可以将传统的双精度应用程序加速多达25倍,同时减少了运行所需的内存、时间和功耗。它可用于 AI 和模拟 HPC 工作负载。
随着混合精度算法在现代超级计算应用程序中的普及,HPC 专家 Jack Dongarra 提出了一个新的基准,即 HPL-AI,以评估超级计算机在混合精度计算上的性能。
混合精度计算主要用于现在很火人工智能领域,感兴趣的读者可以上网搜索更多关于混合精度计算的内容。
-END-
| 整理文章为传播相关技术,版权归原作者所有 |
| 如有侵权,请联系删除 |
往期好文合集
搞懂C语言指针,看这篇就够了!
聊聊指针
「2020年电赛」电源题详细技术方案,立即收藏!
最 后
若觉得文章不错,转发分享,也是我们继续更新的动力。
5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等!
在公众号内回复「更多资源」,即可免费获取,期待你的关注~
-
vb作业,单精度与双精度的区别
2012-05-22 16:50:0013.25用二进制表示的结果及single和double 1101.01 因为1101.01=2^3+2^2+0*2^1+2^0+0*2^-1+2^-2 =8+4+0+1+0+1/4=13.25 integer:只能表示整数,不能有小数点,正...single:单精度,可以有小数点,最大长度是8位13.25用二进制表示的结果及single和double
1101.01
因为1101.01=2^3+2^2+0*2^1+2^0+0*2^-1+2^-2
=8+4+0+1+0+1/4=13.25
integer:只能表示整数,不能有小数点,正负数都可以,最大32767
Long:也只能表示整数,正负都可以,最大2147483648
single:单精度,可以有小数点,最大长度是8位
double:双精度,可以有小数点,最大长度是16位
currency:专门用来表示货币的
单精度和双精度数值类型最早出现在C语言中(比较通用的语言里面),在C语言中单精度类型称为浮点类型(Float),顾名思义是通过浮动小数点来实现数据的存储。这两个数据类型最早是为了科学计算而产生的,他能够给科学计算提供足够高的精度来存储对于精度要求比较高的数值。但是与此同时,他也完全符合科学计算中对于数值的观念:
当我们比较两个棍子的长度的时候,一种方法是并排放着比较一下,一种方法是分别量出长度。但是事实上世界上并不存在两根完全一样长的棍子,我们测量的长度精度受到人类目测能力和测量工具精度的限制。从这个意义上来说,判断两根棍子是否一样长丝毫没有意义,因为结果一定是False,但是我们可以比较他们两个哪个更长或者更短。这个例子很好地概括了单精度/双精度数值类型的设计初衷和存在意义。
基于上述认识,单精度/双精度数值类型从一开始设计的时候,就不是一个准确的数值类型,他只保证在他这个数值类型的精度之内是准确的,精度之外则不保证,比方说,一个数值5.1,很可能存储在单精度/双精度数值中的实际值是5.100000000001或者5.09999999999999。导致这个现象的原因我们可以通过两种方式来解释:
简单的解释方法:
你可以尝试在任何一个控件的属性面板中,设定他的宽度为:3.2CM,当你输入完毕后,你会发现值自动变成了3.199cm,无论你怎么改,你都无法输入3.200CM,因为实际上在电脑中存储的并不是CM为单位的数值,而是“缇”为单位的数值,而“缇”和CM之间的比值,是个很难被除尽的数,因此你输入完毕后,电脑自动转换成了最接近的“缇”值,然后再转换成厘米显示到属性面板上,这一乘一除,两次四舍五入,误差就出来了。单精度/双精度也是类似的原理,其实在二进制存储的时候,单精度/双精度都采用了类似相近分数的方法,而这样的存储是不可能做到准确的。
深入的解释方法:
让我们来看看我们存储到数字介质中的单精度/双精度值到底是怎么样的,我们使用如下代码对单精度类型进行一个解剖:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Sub floatTest()
Dim dblVar As Single
dblVar = 5.731 / 8
dblOutput dblVar
dblVar = dblVar * 2
dblOutput dblVar
dblVar = dblVar * 2
dblOutput dblVar
dblVar = dblVar * 2
dblOutput dblVar
dblVar = dblVar * 2
dblOutput dblVar
dblVar = dblVar * 2
dblOutput dblVar
End Sub
Public Sub dblOutput(ByVal dblVar As Single)
Dim bytVar(3) As Byte
Dim i As Integer, j As Integer
Dim strVar As String
CopyMemory ByVal VarPtr(bytVar(0)), ByVal VarPtr(dblVar), 4
strVar = dblVar & ": "
For i = 3 To 0 Step -1
For j = 7 To 0 Step -1
strVar = strVar & (bytVar(i) And 2 ^ j) / 2 ^ j
Next j
strVar = strVar & " "
Next i
Debug.Print strVar
End Sub
运行后我们得到输出结果(输出格式为高位左,低位右):
.716375: 00111111 00110111 01100100 01011010
1.43275: 00111111 10110111 01100100 01011010
2.8655: 01000000 00110111 01100100 01011010
5.731: 01000000 10110111 01100100 01011010
11.462: 01000001 00110111 01100100 01011010
22.924: 01000001 10110111 01100100 01011010
这里,我们把单精度类型转化成了二进制数据输出,这里我们看到,虽然这六个数字完全不同,但是他们的二进制存储惊人地相似,我们看到红色标记部分,每次都是加1,事实上,单精度数据类型使用从高位开始第1位作为正负标记位(绿色),第2位到第9位,是一个跨字节的有符号字节类型数据,这个数值决定了小数点移动的方向和位数(红色),第10位到32位保存一个整数(蓝色)在存储过程中,电脑首先把输入的值不断移位(乘除2)直到这个数的整数部分占用了全部24位的整数位,然后把移动的位数写入浮点部分(红色),而移位后的结果写入整数部分(蓝色和绿色),小数部分则舍弃。求值的时候则是反向过程,先根据正负位和整数位求值,然后根据红色部分的整数来进行移位(乘除2的次方),最终才是我们得到的单精度数值。双精度数值也是同样原理,只是位数更多而已。
通过解剖单精度数值的二进制存储格式,我们可以清楚看到,实际上单精度/双精度的存储,都要通过乘法和除法,其中必有舍入,如果恰好你的数值在除法中被舍入了,那么你赋的初值就很可能与你最终存储的值不完全相同,其中的微小差异,并不与单精度/双精度的设计目标相违背。
当我们在数据库中或者VBA代码中使用一个单精度/双精度数值的时候,也许你从界面上看不到区别,但是在实际的存储中,这个差别却真真切切地就在那里,当你对其进行相等比较的时候,系统只是简单地作二进制的比较,界面上无法体现的微小差异,在二进制比较面前却无处遁形,于是,你的等于比较返回了一个意料之外的False。 -
float和double精度问题
2017-01-05 16:03:25但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。 float和double的精度是由尾数的位数...double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。 float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
-
java ==和equals的区别_Java中==和equals的比较
2021-02-27 17:12:21整数型:byte 字节类型:1个字节(8位)short 短整型:2个字节(16位)int 整数类型:4个字节(32位) Java默认long 长整型:8个字节(64位)浮点型:float 浮点型(单精度):4个字节(32位)double 双精度类型(双精度):... -
C语言中的%f和%lf的区别
2021-01-19 15:08:55%f和%lf分别对应float类型和double类型用于格式化输入输出时的格式符号。 其中: float,单精度浮点型,对应%f。 double,双精度浮点型,对应%lf。 用于输入时: double 类型使用了%f格式,会导致输入值错误。 float... -
关于值类型和引用类型的区别和总结
2009-12-28 16:52:00值类型(用于存储值)包括:简单类型、结构类型(struct)、枚举类型(enum)简单类型包括:整数类型、布尔类型、字符类型、实数类型(单精度、双精度、十进制型)结构类型用来封装小型变量组,枚举引用类型:变量存的... -
JAVA的变量初始化类成员变量和局部变量区别
2018-05-14 18:35:00对于类的成员变量 ...2、单精度浮点型(float)的基本类型变量的默认值为0.0f。 3、双精度浮点型(double)的基本类型变量的默认值为0.0d。 4、字符型(char)的基本类型变量的默认为 “/u... -
java中的默认初始化--类和局部变量区别
2017-10-05 18:49:082、单精度浮点型(float)的基本类型变量的默认值为0.0f。3、双精度浮点型(double)的基本类型变量的默认值为0.0d。4、字符型(char)的基本类型变量的默认为 “/u0000”。5、布尔性的基本类型变量的默认值为 -
C#基础②——数据类型(decimal和float、double的区别)
2020-07-03 18:11:55//存储一个整数类型的变量 double number2 = 1.11111111111111111111; //double:存储64 位双精度浮点型数据(存小数时电脑默认) float number3 = (float)1.11111111111111111111; //存储32位单精度浮点型数据... -
Java语言八种基本类型和String的区别
2010-07-29 16:43:02Java语言提供了八种基本类型: 六种数字类型(四个整数型,两个浮点型) 字节型byte 8位 短整型short 16位 整型int 32位... 单精度float 32位 双精度double 64位 一种字符类型 字符型char 8位 还有... -
float double decimal类型的区别MySQL
2020-05-12 16:12:17float数值类型表示单精度浮点数值 double数值类型表示双精度浮点数值 decimal是定点型 可用类型名称后加(M,D)来表示浮点型和定点型,其中M表示该值的总共长度(精度),D表示小数点后面的长度(标度),如float(7,5)... -
mysql中float、double、decimal的区别
2020-10-26 13:27:13float类型表示单精度浮点数值,double类型表示双精度浮点数值,float和double都是浮点型,而decimal是定点型; MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的... -
access和dbc区别_Can DBC 文件翻译,不是很标准,凑合看还可以
2020-12-24 06:38:041 引言DBC文件描述单个CAN网络的通信。这个信息足以监测和分析网络并模拟不是...2一般定义本文档中使用以下常规元素:unsigned_integer:一个无符号整数signed_integer:一个有符号的整数double:双精度浮点数char_... -
c语言中%d %f %c %s等的区别
2020-04-29 16:19:54float,单精度浮点型,对应%f double,双精度浮点型,对应%lf %c用来输出一个字符 %s用来输出一个字符串 %o以八进制数形式输出整数 %x以十六进制数形式输出整数,或输出字符串的地址 %p输出... -
C语言中printf,scanf,getchar , puts,gets 的使用及区别
2017-02-05 13:26:281 printf和scanf printf 的函数原型是 printf("", ) ... 单精度浮点数 : %f 双精度福电视: %lf 字符串: %s, 单个字符 : %c 参数表: 使用的是输入参数和输出参数的地址。 关于scanf接 -
Lua - 类型和值
2016-10-17 17:25:30数字 number(double)lua中的数字均以双精度浮点数存放,不存在整数和浮点数的区别,不过在lua的语法说明里面也明确表示,编译时时可以用整数和单精度浮点数表示的。字符串 stringlua中的字符串与其他语言类似,... -
数据类型和数据类型的判断
2018-03-18 20:53:001.数字类型分小数(浮点型,分为单精度(float)、双精度(double))和整数 2.进制:二进制(0,1);八进制(0^8);十进制;十六进制(0……f)——逢多少进1的区别 3.范围:记住两种方法 console.log... -
浮点类型和 小数类型
2018-05-31 11:13:00浮点类型 小数在C#中...计算机对浮点数据的运算速度大大低于对整数的运算速度,因此在对精度要求不高的情况下,我们可以采用单精度类型,而在精度要求较高的情况下可以使用双精度类型。 float类型是32位宽,double... -
Java的基本数据类型
2020-10-27 18:39:47Java的基本数据类型有哪些? Java的基本数据类型分为:整型、浮点...浮点型分为单精度型(float/32)和双精度类型(double/64)这两种。单精度型一般在精度要求不高的时候使用。双精度类型一般在数值精度高的时候使用。 -
MYSQL数据库的常用数据类型
2016-09-19 11:24:00列类型 说明 ...tinyint/smallint/mediumint int(integer)/bigint ...1字节、2字节、3字节、4字节、8字节整数,又可分有符号和无符号两种。...单精度、双精度浮点类型 decimal(dec) ... -
-
C++数字后缀
2013-05-04 14:33:14但由于电脑实际并不是想象中的数字化的(详情参见《C++从零开始(三)》中的类型一节),所以整型数又分成了有符号和无符号整型数,而浮点数则由精度的区别而分成单精度和双精度浮点数,同样的整型数也根据长度分... -
第五章 C程序结构
2018-10-24 08:06:001、实数常量的表示:3.5(双精度),3.5f(单精度),3.5L(长双精度) 2、整数常量:char字符常量(‘a’,‘b’,‘0’)当做一个整型常量参加运算 3、数字字符与英文字母字符的编号(Ascll码)都是顺序... -
Mysql 一
2020-12-02 15:38:351.字段类型 数值类型: int 整数 long 长整型 float 单精度 double 双精度 decimal 钱 字符串: ...datetime和timestamp的区别:http://baijiahao.baidu.com/s?id=1660748223312093233&wfr=spider&a -
python frame用法_Pandas Series.to_frame()用法介绍
2020-11-30 10:48:45系列被定义为可以容纳整数, 字符串, 双精度值等的列表类型。它以列表的形式返回对象, 该列表的索引从0到n开始, 其中n表示系列中值的长度。系列和数据框架之间的主要区别在于, 系列只能包含具有特定索引的单个列表, ... -
Java基本数据类型
2019-09-06 13:53:271、java基本数据类型 java的两大数据类型 :内置数据类型、引用数据类型 内置数据类型:1)六种数字类型:...float:单精度 double:双精度 2、String类和StringBuffer类区别?? String类是不可变字符序列,Strin... -
mysql数据库基础
2015-03-22 21:19:22数据库数据类型有整型,浮点型,日期时间类型,字符类型, 整型分类:TINYINT,SMALLINT,...浮点型:FLOAT,DOUBLE,单精度和双精度浮点数。 日期时间类型:DATA: 1000.1.1.-----9999.12.31; DATATIME:1000.1.1.