浮点运算
- 格式:docx
- 大小:111.19 KB
- 文档页数:10
浮点数的运算方法浮点数是计算机中一种表示实数的数据类型,其特点是可以表示带有小数部分的数字。
在进行浮点数的运算时,需要考虑到浮点数的精度问题、舍入误差以及运算顺序等因素。
浮点数的表示方法为:±m×be,其中m为尾数(即小数部分的数值),b为基数或底数,e为指数(表示位移的量)。
1.浮点数加法运算:-对两个浮点数的指数进行比较,将较小指数的浮点数的尾数左移指数之差的位数,使两个浮点数的小数点对齐。
-对齐后的尾数相加,得到一个和。
-对和进行规格化,即将结果的尾数进行处理,使其满足指定的位数限制。
-对规格化后的结果进行舍入运算,得到最终结果。
2.浮点数减法运算:-先将减数的指数调整与被减数的指数相等。
-对齐后的尾数相减,得到一个差。
-对差进行规格化和舍入运算,得到最终结果。
3.浮点数乘法运算:-将两个浮点数的指数相加,得到加法的和,并相应地调整两个浮点数的尾数。
-尾数相乘,得到一个乘积。
-对乘积进行规格化和舍入运算,得到最终结果。
4.浮点数除法运算:-将被除数的指数减去除数的指数,得到差,并相应地调整两个浮点数的尾数。
-尾数相除,得到一个商。
-对商进行规格化和舍入运算,得到最终结果。
在进行浮点数运算时需要注意一些问题:-浮点数的精度问题:由于浮点数的尾数有限位数,所以会存在精度丢失的问题。
这就意味着进行浮点数运算时,可能会出现舍入误差,导致结果有微小的偏差。
-运算顺序:浮点数的运算顺序可能会影响最终结果。
在连续进行多次浮点数运算时,可能会得到不同的结果。
这是因为浮点数的运算不满足交换律和结合律。
因此,在编程中需要谨慎选择运算顺序,以避免结果的不确定性。
-溢出和下溢问题:由于浮点数的范围限制,可能会出现溢出(结果超出浮点数的表示范围)或下溢(结果过小,无法表示)的情况。
针对这些情况,需要进行特殊处理,如返回特定的错误码或进行科学计数法表示。
在实际编程中,可以使用编程语言提供的浮点数运算库或内置函数来进行浮点数运算,以确保运算结果的准确性和可靠性。
什么是浮点运算
什么是浮点运算
浮点运算就是实数运算,因为计算机只能存储整数,所以实数都是约数,这样浮点运算是很慢的而且会有误差。
当我们用不同的电脑计算圆周率时,会发现一台电脑的计算较另一台来讲结果更加精确。
或者我们在进行枪战游戏的时候,当一粒子弹击中墙壁时,墙上剥落下一块墙皮,同样的场面在一台电脑上的表现可能会非常的呆板、做作;而在另外一台电脑上就会非常生动形象,甚至与我们在现实中看到的所差无几。
这都是浮点运算能力的差异导致的。
如果是实数的话,就不是这样了,机器有两种办法表示实数,一种是定点,就是小数点位置是固定的,一种是浮点,就是小数点位置不固定,计算方法也比较麻烦,通常会比整数运算代价大很多。
计算机里整数和小数形式就是按普通格式进行存储,例如1024、3.1415926等等,这个没什么特点,但是这样的数精度不高,表达也不够全面,为了能够有一种数的通用表示法,就发明了浮点数。
浮点数的表示形式有点像科学计数法,例如1024就能表示成0.1024×10^4,3.1415926就能表示成0.31415926×10^1,这就是浮点数。
浮点数进行的运算就是浮点运算。
浮点运算比常规运算更复杂,因此计算机进行浮点运算速度要比进行常规运算慢得多。
1。
浮点数的运算方法浮点数是计算机中用于表示实数的一种数据类型,由于实数是无限的,而计算机只能存储有限的信息,所以必然存在精度误差。
浮点数的运算涉及到加法、减法、乘法和除法等基本运算,以及开方、幂函数等高级运算。
1.加法运算:浮点数相加时,先将较小的浮点数调整为与较大的浮点数相同的指数,然后进行尾数的相加,最后对结果进行规格化处理,即进行舍入操作,得到最终的结果。
2.减法运算:浮点数相减的原理与加法相同,只是在相减之前,需要将两个浮点数的指数调整为相等,然后进行尾数的相减操作,最后同样需要对结果进行规格化处理。
3.乘法运算:浮点数相乘时,将两个浮点数的指数相加,然后将尾数相乘得到结果的尾数部分,最后对结果进行规格化处理。
4.除法运算:浮点数除法的原理与乘法类似,先将两个浮点数的指数相减,然后将尾数相除得到结果的尾数部分,最后同样需要进行规格化处理。
5.开方运算:浮点数的开方运算是通过求解多项式的根来实现的,常用的方法有牛顿法、二分法和二次近似法等。
这些方法都是通过迭代的方式,逐步逼近平方根的值,直到达到所需的精度。
6.幂函数运算:浮点数的幂函数运算可以通过连乘或连乘的方式实现。
幂函数运算的精度取决于底数和指数的精度以及所需的结果精度。
在浮点数的运算过程中,需要注意以下几个常见问题:1.精度丢失:浮点数的表示是有限的,不可避免地存在精度误差,特别是在进行连续的浮点数运算时,会导致误差累积,可能导致结果的不准确。
2.舍入误差:浮点数的结果需要进行舍入操作以保持一定的精度。
舍入规则有多种,如四舍五入、向上取整、向下取整等,选择合适的舍入规则可以减小误差。
3.溢出和下溢:浮点数的范围是有限的,当计算结果超出范围时,会发生溢出;当结果接近零但无法表示时,会发生下溢。
这两种情况都需要进行特殊处理。
4. 特殊数值:浮点数中有几个特殊的数值,如无穷大(Infinity)、非数值(NaN)和零(0)。
这些特殊值的运算需要按照特定的规则进行处理,以免引起错误。
简介当我们用不同的电脑计算圆周率时,会发现一台电脑的计算较另一台来讲结果更加精确。
或者我们在进行枪战游戏的时候,当一粒子弹击中墙壁时,墙上剥落下一块墙皮,同样的场面在一台电脑上的表现可能会非常的呆板、做作;而在另外一台电脑上就会非常生动形象,甚至与我们在现实中看到的所差无几。
这都是浮点运算能力的差异导致的。
定点与浮点大学计算机基础中已经了解过计算机的实数表示方法可分为两种即定点与浮点1、定点数:定点数指小数点在数中的位置是固定不变的,通常有定点整数和定点小数。
在对小数点位置作出选择之后,运算中的所有数均应统一为定点整数或定点小数,在运算中不再考虑小数问题。
(1)定义:数据中小数点位置固定不变的数(2)种类:定点整数(3)小数点在符号位与有效位之间。
注:定点数受字长的限制,超出范围会有溢出。
2、浮点数:浮点数的表示形式有点像科学计数法(*.*****×10^***),它的表示形式是0.*****×10^***,在计算机中的形式为 .***** e ±***),其中前面的星号代表定点小数,也就是整数部分为0的纯小数,后面的指数部分是定点整数。
利用这样的形式就能表示出任意一个整数和小数,例如1024就能表示成0.1024×10^4,也就是 .1024e+004,3.1415926就能表示成0.31415926×10^1,也就是 .31415926e+001,这就是浮点数。
浮点数进行的运算就是浮点运算。
注:其浮点数的精度由尾数决定,数的表示范围由阶码决定。
浮点数,这个复杂点,有三种格式单精度:_31_30________23_22___________0符号指数有效数双精度:_63_62__________52_51__________________0符号指数有效数扩展精度数:_79_78____________64_63___________________0符号指数有效数3、定点数与浮点数区别定点表示法运算直观,但数的表示范围较小,不同的数运算时要考虑比例因子的选取,以防止溢出。
2.5浮点运算与浮点运算器2.5.1浮点数的运算规则浮点数的形式X=Mx * 2E x▲ 尾数的右移: 若尾数是原码表示,每右移一位,符号位不参加移位,尾数高位补0;若尾数是补码表示,每右移一位,符号位参加右移,并保持补码的符号不变。
一、浮点加法和减法设有两个浮点数:X=Mx * 2E x Y=My * 2E y它们的加减步骤是:1、对阶——使两个数的阶码相等,才能进行尾数的加减。
对阶原则——小阶向大阶看齐,即小阶的尾数向右移位(相当于小数点左移),每右移一位,其阶码加1,直到两数的阶码相等为止,右移的位数等于阶差△E 。
例1:两浮点数X=201*0.1101, Y=211*(-0.1010),将两个数对阶。
解:假设两数在计算机中以补码表示。
[△E]补=[Ex]补 – [Ey]补=[Ex]补 + [–Ey]补=00 01 + 11 01=11 10即△E=-2,表示Ex 比Ey 小2,因此将X 的尾数右移2位:右移一位,得[X]浮=00 10,00.0110再右移一位,得[X]浮=00 11,00.0011对阶完毕。
2、尾数求和+ 尾数和为:3、规格化(1)对于补码来说 规格化(2)规格化的方法浮点数的尾数相加后得到补码的形式M ,对比符号位和小数点后的第一位,如果它们不等,即为00. 1…和11. 0…的形式,就是规格化的数;如果它们相等,即00. 0…或11. 1…,就不是规格化的数,此时要进行左规格化,或左规。
向左规格化——尾数左移1位,阶码减1。
当结果出现01.…或10. …的形式时,要进行右规格化,或右规。
00 001111 011011 1001 正数:00. 1… 负数:11. 0…向右规格化——尾数右移1位,阶码加1。
4、舍入在对阶或向右规格化时,尾数要向右移位,这样,被右移的尾数的低位部分会被丢掉,从而造成一定的误差,因此要进行舍入处理。
舍入的方法——“0舍1入”:如果右移时,被丢掉数位的最高位是0则舍去,反之则将尾数的末位加“1”。
什么是浮点运算数据是怎样的浮点运算就是实数运算,因为计算机只能存储整数,那么你对浮点运算了解多少呢?以下是由店铺整理关于什么是浮点运算的内容,希望大家喜欢!浮点运算的简介当我们用不同的电脑计算圆周率时,会发现一台电脑的计算较另一台来讲结果更加精确。
或者我们在进行枪战游戏的时候,当一粒子弹击中墙壁时,墙上剥落下一块墙皮,同样的场面在一台电脑上的表现可能会非常的呆板、做作;而在另外一台电脑上就会非常生动形象,甚至与我们在现实中看到的所差无几。
这都是浮点运算能力的差异导致的。
如果是实数的话,就不是这样了,机器有两种办法表示实数,一种是定点,就是小数点位置是固定的,一种是浮点,就是小数点位置不固定,计算方法也比较麻烦,通常会比整数运算代价大很多FPU->Floating Point Unit,浮点运算部件BCD->Binary Coded Decimal 压缩的二进制数,是用4个位来表示数字0~9,一个byte表示两个十进制数,比如1001111表示79 科学计数法:a×10的n次幂的形式。
将一个数字表示成(a×10的n次幂的形式),其中1≤|a|<10,n表示整数,这种记数方法叫科学记数法浮点运算的数据浮点运算使用三种不同的数据:1)整数(Integer),又分为字,短整数(Short Integer)和长整数(longint)2)实数(Real)分单精度(Single Real)和双精度(Double Real)3)压缩的二十进制数(BCD)下面是其位数(bits)和能表示的大致范围和Type Length Range-----------------------------------------------Word Integer 16 bit -32768 to 32768Short Integer 32 bit -2.14e9 to 2.14e9Long Integer 64 bit -9.22e18 to 9.22e18Single Real 32 bit 1.18e-38 to 3.40e38Double Real 64 bit 2.23e-308 to 1.79e308extended Real 80 bit 3.37e-4932 to 1.18e4932Packed BCD 80 bit -1e18 to 1e18双精度数和扩展精度数表示范围对一般应用来说已经足够大了!1)整数,以补码形式存储,正数的补码是其本身,负数补码是其绝对值的各位变反后加1,下面是实际存储的例子:0024 var1 dw 24FFFE var2 dw -2000004D2 var3 dd 1234FFFFFF85 var4 dd -1230000000000002694var5 dq 98762)BCD数在FPU中用80位表示正好是浮点堆寄存器的宽度,在其格式如下存储:Bit79___72_71________________________________________0符号 ---18个二十进制数——————————---看下面的例子:00000000000000012345 var1 dt 1234580000000000000000100 var2 dt -1003)浮点数,这个复杂点,有三种格式单精度:_31_30________23_22___________0符号指数有效数双精度:_63_62__________52_51__________________0符号指数有效数扩展精度数:_79_78____________64_63___________________0符号指数有效数浮点运算的格式单精度:_31_30________23_22___________0符号指数有效数双精度:_63_62__________52_51__________________0符号指数有效数扩展精度数: _79_78____________64_63___________________0符号指数有效数例子:C377999A var1 dd -247.640000000 var2 dd 2.0486F4200 var3 real4 2.45e+54059100000000000 var4 dq 100.253F543BF727136A40 var5 real8 0.00123C377999A var1 dd -247.640000000 var2 dd 2.0486F4200 var3 real4 2.45e+54059100000000000 var4 dq 100.253F543BF727136A40 var5 real8 0.001235400487F34D6A161E4F76 var6 real10 33.9876DD和real4都可以在asm中来定义单精度浮点数,4 bytesDQ和real8都可以在asm中来定义双精度浮点数,8 bytesDT和real10都可以在asm中来定义扩展精度浮点数,10 bytes。
浮点数计算公式浮点数的相关计算公式1. 浮点数的基本运算加法运算浮点数的加法运算可以使用以下公式表示:x + y = (x1 + y1) * 2^e其中,x和y分别是两个浮点数,x1和y1分别是其对应的尾数,e是两个浮点数的指数之差的最大值。
例如,当x =,对应的尾数为,`y = `,对应的尾数为,则其加法运算结果为:+ = ( + ) * 2^(-2) = * 2^(-2) = * =减法运算浮点数的减法运算可以使用以下公式表示:x - y = (x1 - y1) * 2^e其中,x和y分别是两个浮点数,x1和y1分别是其对应的尾数,e是两个浮点数的指数之差的最大值。
例如,当x =,对应的尾数为,`y = `,对应的尾数为,则其减法运算结果为:- = ( - ) * 2^(-2) = * 2^(-2) = * =乘法运算浮点数的乘法运算可以使用以下公式表示:x * y = (x1 * y1) * 2^(e1 + e2)其中,x和y分别是两个浮点数,x1和y1分别是其对应的尾数,e1和e2分别是两个浮点数的指数。
例如,当x =,对应的尾数为,`y = `,对应的尾数为,则其乘法运算结果为:* = ( * ) * 2^(3 + 3) = * 2^6 = * 64 =除法运算浮点数的除法运算可以使用以下公式表示:x / y = (x1 / y1) * 2^(e1 - e2)其中,x和y分别是两个浮点数,x1和y1分别是其对应的尾数,e1和e2分别是两个浮点数的指数。
例如,当x =,对应的尾数为,`y = `,对应的尾数为,则其除法运算结果为:/ = ( / ) * 2^(3 - 3) = 10 * 2^0 = 10 * 1 = 102. 特殊情况处理零值处理在浮点数的计算中,存在零值的处理,在零值与其他浮点数进行运算时,会有一些特殊的规则。
•当零值与非零值相加时,结果为非零值。
•当零值与非零值相减时,结果为非零值。
浮点运算整数运算
浮点运算与整数运算是计算机中的算法的重要组成部分,在绝大多数
情况下,它们不仅能够提供数据处理的性能,还为用户提供数据分析
等有效方法。
一、浮点运算
1、什么是浮点运算
浮点运算指的是处理带进位数据的计算,这是一种具有特殊特性的数
字运算,其运算结果可以在较大范围内浮动,因此,该运算技术当中,除了可以计算非定点数以外,也可以计算有限精度的定点数。
2、浮点运算的优势
(1)可以直接处理带有进位的数据,在处理大量数据时,能够获得更
高的计算性能;
(2)能够计算浮动的数据,可以准确的处理多个体积较小的数据,在
某些精度要求较高的应用中,可以显著提高处理的精度;
(3)能够实现一系列数值计算,如函数逼近、平均数据插值等,提高
了计算的精度。
二、整数运算
1、什么是整数运算
整数运算是指计算机使用一系列算法,处理整数数据的运算,这是一
种以八进制、十六进制等形式处理数据的运算,其结果可以是正数或
负数,例如加减乘除等一系列整数运算操作。
2、整数运算的优势
(1)操作简单,数据具有唯一性,处理时可以使用一系列的简单的算法;
(2)具有良好的稳定性,处理数据时,具有可预测性,可以实现信息精准的传输;
(3)容量小,在处理大量数据时,代价小,效率高,运算时间短,适合大规模并行处理。
综上,浮点运算与整数运算在数字计算和信息处理当中,各司其职,都能为不同的应用领域提供有效的解决方案,两者的综合使用,能够进一步提高计算能力,更好地支持用户解决相关的计算问题。
STM32-F4属于Cortex-M4构架,与M0、M3的最大不同就是有硬件浮点运算FPU,数学计算速度相比普通cpu运算快上几十倍。
想要使用FPU首先包含#include “arm_math.h”,还有在keil的target选项中勾选use single precision。
1.1 简单的FPU运算性能测试测试条件是开启一个100ms定时器,定时串口打印计算次数,优化级别是0,main函数中运行的代码如下:float a=1.1,b=1.2,c=1.3,d=1.4;1、FPU运算474566次,CPU运算64688次,除法速度快了7.3倍多。
c = b / d;2、FPU运算722169次,CPU运算244271次,乘法运算快了3倍。
FPU的乘法运算比除法运算快1.5倍。
c = b * d;3、FPU运算19398次,CPU运算19628次,FPU的双精度除法运算没有优势,比单精度运算慢了24.5倍c = b / 1.4;4、FPU运算503321次,CPU运算65450次,单精度常数和变量的运算差不多,单精度常数的除法快6%左右,这根编译器的关系比较大。
c = b / 1.4f;5、FPU运算519073次,跟下面比较说明整形常数和单精度常数的除法运算速度几乎一样。
c = b / 3;6、FPU运算519057次c = b / 3.0f;7、FPU运算263643次c = arm_cos_f32(1.3f);8、FPU运算3949次,说明IT给的DSP库运算速度还是很给力的,速度快了67倍c = cos(1.3f);1.2 代码设置旧版本的keil设置如下,但是发现我使用的keil5包含的新固件库已经不需要这一步了。
如果没有启动FPU而使用数学函数运算时,CPU执行时认为遇到非法指令而跳转到HardFault_Handler()中断函数中死循环。
因此,需要在系统初始化时开启FPU。
在system_stm32f4xx.c中的SystemInit()函数中添加如下代码:/* FPU settings ------------------------------------------------------------*/#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */#endif当__FPU_PRESENT=1且__FPU_USED=1时,编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除。
需要使用固件库自带的arm_math.h而非编译器自带的math.h,这个文件根据编译控制项(__FPU_USED ==1)来决定是使用哪一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的优化函数来解决问题。
1.3编译控制在arm_math.h开头部分有一些编译控制信息:[cpp] view plain copy#ifndef _ARM_MATH_H#define _ARM_MATH_H#define __CMSIS_GENERIC /* disable NVIC and Systick functions */#if defined (ARM_MATH_CM4)#include "core_cm4.h"#elif defined (ARM_MATH_CM3)#include "core_cm3.h"#elif defined (ARM_MATH_CM0)#include "core_cm0.h"#else#include "ARMCM4.h"#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."#endif#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */#include "string.h"#include "math.h"从中可以看出,为了使用STM32F4的arm_math.h,我们需要定义ARM_MATH_CM4;否则如果不使用CMSIS的库,就会调用Keil自带的math.h。
另外,定义控制项__CC_ARM在某些数学函数中会使用VSQRT指令(浮点运算指令),运算速度比Q指令要快很多。
总结一下,需要添加宏定义ARM_MATH_CM4, __CC_ARM。
1.4添加库根据使用的器件和运算模式,添加arm_cortexMxx_math.lib到工程文件中,位于\Libraries\CMSIS\Lib\ARM中。
* The library installer contains prebuilt versions of the libraries in the <code>Lib</code> folder.* - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4)* - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4)* - arm_cortexM4l_math.lib (Little endian on Cortex-M4)* - arm_cortexM4b_math.lib (Big endian on Cortex-M4)* - arm_cortexM3l_math.lib (Little endian on Cortex-M3)* - arm_cortexM3b_math.lib (Big endian on Cortex-M3)* - arm_cortexM0l_math.lib (Little endian on Cortex-M0)* - arm_cortexM0b_math.lib (Big endian on Cortex-M3)注:如果存储空间不允许,也可以不添加库,只添加\Libraries\CMSIS\DSP_Lib\Source中需要的源文件和arm_math.h。
其他DSP使用示例见\Libraries\CMSIS\DSP_Lib\Examples。
1.5 DSP_Lib的文件结构BasicMathFunctions:提供浮点数的各种基本运算函数,如加减乘除等运算。
对于M0/M3只能用Q运算,即文件夹下以_q7、_q15和_q31结尾的文件;而M4F能直接硬件浮点计算,属于文件夹下以_f32结尾的文件。
CommonTables:arm_common_tables.c文件提供位翻转或相关参数表。
ComplexMathFunctions:复述数学功能,如向量处理,求模运算的。
ControllerFunctions:控制功能,主要为PID控制函数。
arm_sin_cos_f32/-q31.c函数提供360点正余弦函数表和任意角度的正余弦函数值计算功能。
FastMathFunctions:快速数学功能函数,提供256点正余弦函数表和任意任意角度的正余弦函数值计算功能,和Q值开平方运算:FilteringFunctions:滤波函数功能,主要为FIR和LMS(最小均方根)滤波函数。
MatrixFunctions:矩阵处理函数。
StatisticsFunctions:统计功能函数,如求平均值、计算RMS、计算方差/标准差等。
SupportFunctions:支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q任意格式相互转换。
TransformFunctions:变换功能。
包括复数FFT(CFFT)/复数FFT逆运算(CIFFT)、实数FFT (RFFT)/实数FFT逆运算(RIFFT)、和DCT(离散余弦变换)和配套的初始化函数。
1.6常用库函数需要包含头文件:#include <arm_math.h>float32_t arm_sin_f32(float32_t x);float32_t arm_cos_f32(float32_t x);static __INLINE arm_status arm_sqrt_f32(float32_t in, float32_t *pOut)使用STM32F4XX自带数学库"arm_math.h"分类:STM32| 标签:STM32 arm_math DSP2013-08-28 16:24 阅读(12285)评论(0)使用STM32F4XX自带数学库"arm_math.h"STM32-F4属于Cortex-M4F构架,这与M0、M3的最大不同就是具有FPU(浮点运算单元),支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,除了#include “arm_math.h”(而非用编译器自带的math.h)以外,(arm_math.h位于\Libraries\CMSIS\Include文件夹)还需要进行设置。
1、代码设置如果没有启动FPU而使用数学函数运算时,CPU执行时认为遇到非法指令而跳转到Hard Fault_Handler()中断函数中死循环。
因此,需要在系统初始化时开启FPU。
在system_ stm32f4xx.c中的SystemInit()函数中添加如下代码:/* FPU settings ------------------------------------------------------------*/#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 F ull Access */#endif2、编译控制从上面的代码可以看出,当__FPU_PRESENT=1且__FPU_USED=1时,编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除了。