当前位置:文档之家› PLC(FX2N)小数点(浮点)运算编程研究讲义2012

PLC(FX2N)小数点(浮点)运算编程研究讲义2012

PLC(FX2N)小数点(浮点)运算编程研究讲义2012
PLC(FX2N)小数点(浮点)运算编程研究讲义2012

gPLC (FX2N )浮点(小数点)运算编程研究讲义2012

目录

◆ PLC (FX2N)浮点(小数)运算编程概要

◆ 实验一 将一个整数转变为一个二进制小数,并存入FX2N 的Dn 中(产生一个浮点数,存入FX2N 的Dn 中)

◆ 实验二 将2个二进制小数(或其中一个常数K 、H )进行四则运算

◆ 实验三 一个二进制小数,如何在LED 数码显示器,或者组态王上显示监控

◆ 实验四 二进制浮点数运算实例

◆ 实验五 任意位浮点数(小数)的输入

◆ 附1:PLC 数值显示(LED 数码显示器)含小数点方法

◆ 附2:PLC (FX2N )中输入小数小结、要点:

PLC (FX2N)浮点(小数)运算编程概要

1、 PLC (FX2N )浮点数(小数)概论:

◆ 二进制小数概念:二进制小数在PLC (FX2N )中存储占用32位(即占用2个连续编号的Dn 、Dn+1),最高位bit31位是符号位(1是负数,0是正数),其他位(bit30~bit0)是数值位,数值位分尾数段和指数段,bit0~bit22共23位是尾数段,bit23~bit30共8位是指数段;注:二进制小数不是按2的补码处理;

bit 0

bit 1bit 2bit 3bit 4bit 5bit 6bit 7bit 8bit 9bit 10bit 11bit 12bit 13bit 14bit 15bit 16

bit 17bit 18bit 19bit 20bit 21bit 22bit 23bit 24bit 25bit 26bit 27bit 28bit 29bit 30bit 31符号

指数段(8位)尾数段(23位)

(1位)

Dn Dn+1二进制小数在PLC(FX2N)中存入形式

数值位(31位)

◆ 浮点数(小数)运算规则概念

? 进行浮点数(小数)运算的各Dn 只能是二进制小数、常数K 、H ;不能是整数或十进制小数;

? 若Dn 中数据是整数,需用FLT 指令转化为二进制小数形式,再参与运算;

? 若Dn 中数据是十进制小数,需用EBIN 指令转化为二进制小数形式,再参与运算;

? 若Dn 中数据是常数K 、H ,可直接参与运算,无需转化,因其在参与运算过程中会自动转化;

? 浮点数运算中指令前一般应加D ,因参与运算的二进制小数都占有二个连续的Dn 、为32位数据;

? 浮点数运算的种类在PLC (FX2N )中有加9EADD )、减(ESUB )、

乘(EMUL )、除(EDIV )、正弦(SIN )、余弦(COS )、正切(TAN )、

数类转化(FLT 、INT 、EBIN 、EBCD )、比较(ECMP 、CZCP )等等;

◆ 二进制小数的PLC 处理中的监控:因二进制小数数值与指数占用了

二个连续的Dn ,且难以区别,故难以在组态王等上监控(如LED 数

码显示器、组态王等)、监控的数据只是乱码,故若要监控需将这些

二进制小数用EBCD 指令转化为十进制小数,十进制小数占用连续二

个Dn ,编号大的为指数段,编号小的为尾数值、区别明确,易于监

控;如:3130D D -;其中D30为尾数值、D31为指数段;注:在FX2N

仿真软件上易监控仿真结果;

◆ 十进制小数概念:十进制小数在PLC (FX2N )中占用32位,在PLC

内部存储时采用2个连续编号的Dn 、Dn+1,编号小的保存尾数段

(Dn ),编号大的保存指数段(Dn+1);如:3130D D -;其中D30为尾

数值、D31为指数段;

bit 0

bit 1bit 2bit 3bit 4bit 5bit 6bit 7bit 8bit 9bit 10bit 11bit 12bit 13bit 14bit 15bit 16bit 17bit 18bit 19bit 20bit 21bit 22bit 23bit 24bit 25bit 26bit 27bit 28bit 29bit 30bit 31

符号位

指数段(16位)尾数段(16位)(1位)Dn

Dn+1十进制小数在PLC(FX2N)中存入形式

符号位(1位) ◆ 十进制小数的运算:十进制小数无法在PLC (FX2N )中直接进行运算

处理,需用EBIN 指令转化为二进制小数再进行运算;

◆ 十进制小数的数值监控作用:十进制小数易于数值监控,而二进制

小数难以直接监控,直接监控数值往往为乱码,故PLC 中二进制小

数若需监控,可用EBCD 指令将其转化为十进制小数;注:十进制小

数在FX2N 仿真软件上监控反而出现乱码;

◆ 二~十进制数相互转化中的误差:

? 在二进制小数转化为十进制小数、或十进制小数转化为二进制小

数过程中,易产生一定的误差,因有效数字四舍五入的缘故;

? 因某些自动控制采用浮点数可提高控制精度与品质,故需浮点数

运算及处理;

? 因某些自动控制部件只能采用整数,故需将浮点数转化为整数,

其转化过程有四舍五入,将产生一定的误差。

2、得到一个二进制小数的方法概要(与得到一个十进制小数的方法互为逆运算):

◆ 方法一:如产生一个二进制小数254.6(往D20中存入一个二进制小

数254.6);

? 先往D0中送入一个整数(2546);MOV K2546 D0;

? 再用二进制整数转化为二进制小数指令FLT 转化得到二进制小数

形式,存入D10(2546.00);FLT D0 D10;注:FLT 指令仅是将

整数的表示形式转化为小数的表现形式(2546---2546.00),但

此数值实质上仍是整数;

?最后将二进制小数形式除以常数10的倍数,得到所需小数后为

几位的二进制小数(254.6);DEDIV D10 K10 D20;注:小数处

理指令与整数处理指令类似,只是前面加E,表示属小数处理指

令;另外小数数值占二个Dn,为32位,故运算指令前需加D;

?注:二进制小数因是32位数值,整个数值254.6占了(D21)D20;

?注:方案一PLC软件监控仿真结果正常;组态王监控为乱码;

?例程:

◆方法二:如产生一个二进制小数254.6(往D10中存入一个二进制小

数254.6);

?将一个需转化的整数送入D0(2546);MOV K2546 D0;;

?再将一个负数(为小数的位数)送入D1;MOV -1 D1;

?注:上述二个Dn标号必须连续、且存放整数的Dn标号应在前

(D0)、存放负数的Dn标号应在后(D1);

?最后用十进制小数转化为二进制小数指令EBIN转化得到所需的

二进制小数(254.6);DEBIN D0 D10;注:小数处理指令与整数

处理指令类似,只是前面加E,表示属小数处理指令;另外小数

数值占二个Dn,为32位,故运算指令前需加D;

?注:二进制小数因是32位数值,整个数值254.6占了(D21)D20;

?注:方法二PLC软件监控仿真为乱码;组态王监控为乱码;

?例程:

3、得到一个十进制小数的方法概要(与得到一个二进制小数的方法互为逆运

算):

◆方法一:将一个二进制小数通过EBCD指令(二进制小数转化为十进制

小数指令)转化得到;注:直接结果显示PLC监控仿真为乱码,可在组

态王等上用尾数\指数形式显示结果Dn-Dn+1;

方法二:先往Dn中送入一个整数;再往Dn+1中送入一个负数(为小数的位数);注:上述二个Dn标号必须连续、且存入整数的Dn标号在前(Dn)、存入负数的Dn标号在后(Dn+1)。注:直接结果显示PLC 监控仿真为乱码,可在组态王等上用尾数\指数形式显示结果Dn-Dn+1;

实验一将一个整数转变为一个二进制小数,并存入FX2N的Dn中(产生一个

浮点数,存入FX2N的Dn中)

1、具体实例:将一个整数12,转变为二进制小数1.2,存入(D21)D20中;

为了在组态王上易监控,再转化为十进制小数存入(D31)D30中;并用D30-D31

方式在组态王显示结果。

2、程序1段及分析:

先将常数(整数)12存入D0中;再用FLT指令将D0中的常数(整

数)转变为二进制小数形式(12.00)存入D11(D10)中;最后用二

进制小数除法指令DEDIV得到1位小数的二进制小数(1.200)存入

(D21)D20中;

M8002

[MO V K12 D0]将常数12存入D0中

[FL T D0 D10]将D0中整数12转变为二进制带小数12.00

并存入D11、D10中

[DE DIV D10 K10 D20]将D11、D10中二进制小数12.00除10

结果1.2存入D21、D20中

3、程序1段PLC仿真:

4、程序2段及分析:

为了实现(D21)D20中数值的组态王监控,先用DEBCD指令将其转化为十进制小数、存入(D31)D30中;

M8002

[DE BCD D20 D30]将D21、D20中的二进制小数1.2转变为十进制小数1.2

并存入D31、D30中

5、程序2段PLC仿真:

6、程序3段及分析、PLC仿真:

十进制小数(D31)D30中指数段(D31)值作正负值判别,若是负值则求补码,再显示;若是正值则不需处理,直接显示;(指数段作正负判别是为了:若可能出现负数,需求补码处理成原码绝对值----十进制小数的指数一般都是负数,如此处-3);

7、程序4段及分析、PLC仿真:

十进制小数(D31)D30中尾数段(D30)值作正负值判别,若是负值则求补码,再显示;若是正值则不需处理,直接显示;(尾数段作正负判别是为了:若可能出现负数,需求补码处理成原码绝对值----为负数的十进制小数时才可能出现,此处不是);

8、组态王监控结果及说明:

在组态王监控中,原数D0=12,将其转化为1.200存入(D31)D30,并用D30-D31方式显示(1199×10-3):

9、 总的PLC 程序及解说、仿真结果:

10、几点说明:

◆ 将一个整数转变为二进制小数形式,用FLT 指令;

◆ 二进制小数形式数在FX2N 中:

? 占用二个连续Dn 存储,占32位;

? b0位—b22位(共23位)是尾数位;

? b23位—b30位(共8位)是指数位;

? b31位是符号位(1为负数,0为正数);

? 二进制小数不是按2的补码处理;

◆ 因上述规则,故二进制小数难以直接监控,直接监控会出现乱码;

一般可将其转变为十进制小数,再进行监控;

◆ 其整数后面(小数点后面)为三位小数形式;

◆ 例如:一个整数12转变为二进制小数形式数,形式为12.000;

b0b1b2b3b4b5b6b7b8b9b10b11b12b13b14b15D10b16b17b18b20b21b22b19b23b24b25b26b27b28b29b30b31

D11二进制小数尾数段(23位)

二进制小数指数段(8位)二进制小数

符号位(1位)1:负数

0:正数二进制小数(共32位,占2个D n)

◆ 将二进制小数转变为十进制小数形式,用EBCD 指令;

◆ 十进制小数形式在FX2N 中:

? 占用二个连续Dn 存储,占32位;

? Dn 编号小的是尾数段,Dn 编号大的是指数段;

? Dn 的最高位都是符号位;

? 十进制小数是按2的补码处理;

? 例如:一个二进制小数转变为十进制小数存入D31、D30中,其

表示形式为:3130D D -,即3101199-?;即D30中存的是尾数段

1199;D31中存的是指数段-3。

◆ 因上述规则,故十进制小数可以用于直接监控;

◆ 将二进制小数转变为十进制小数时,十进制小数的尾数段为4位,

故转变可能会出现一定的误差。 b0b1b2b3b4b5b6b7b8b9b10b11b12b13b14b15D30b16

b17b18b20b21b22b19b23b24b25b26b27b28b29b30b31D31

十进制小数尾数段(16位)十进制小数指数段(16位)十进制小数指数段

符号位(1位)1:负数

0:正数十进制小数(共32位,占2个D n)

十进制小数尾数段符号位(1位)

1:负数0:正数

实验二将2个二进制小数(或其中一个常数K、H)进行四则运算

1、具体实例:产生2个二进制小数,(D21)D20=2.4,(D26)D25=1.2,再将这

2个二进制小数进行加减乘除等四则运算处理;

2、FX2N程序及解说、仿真

3、程序说明

?首先用MOV指令将整数24放入D1中、整数12放入D2中;

?用FLT指令将D1中的整数24转变为二进制小数形式24.00存入D10

中、将D2中的整数12转变为二进制小数形式12.00存入D15中;

?用DEDIV指令将D10中的二进制小数形式数24.00成为具有一位小

数的二进制小数2.400、用DEDIV指令将D15中的二进制小数形式

数12.00成为具有一位小数的二进制小数1.200;

?二进制小数 2.400与12.00进行加减乘除四则运算:

2.4+1.2=(D31)D30;2.4-1.2=(D36)D35;2.4×1.2=(D41)D40;2.4÷

1.2=(D46)D45;

4、几点说明

?将FX2N中Dn的多个二进制小数进行四则运算,它们类型需都为浮

点形式;

?若某个类型不是浮点形式,需用FLT转化,再参与运算;

?但常数K、H无需转化,因其在参与运算过程中会自动转化为浮点形

式;

?二进制小数在进行四则运算过程中,都需应用FX2N的浮点四则运算

指令,而不能应用普通四则运算指令;

?运算结果若需监控的(LED数码显示器、组态王等),可将其转换为

十进制小数再监控。

实验三一个二进制小数,如何在LED数码显示器,或者组态王上显示监控1、具体实例:产生一个二进制小数1.2,并分别组态王上监控显示、在LED

数码显示器上显示。

2、编程思路解读:

◆首先用FLT指令及DEDIV指令产生1个1位二进制小数1.2;存入(D11)

D10中;

◆用DEBCD指令将该二进制小数1.2转化为十进制小数1.2,并存入

(D101)D100中;

◆将十进制小数的指数段(高位Dn,即D101)进行正负符号判别:

?正数则直接显示十进制小数的指数值D101;

?负数则先求补码,再显示十进制小数的指数值;(显示数值前面加负

号,大多如此);D101=-3;

◆将十进制小数的尾数段(低位Dn,即D100)进行正负符号判别:

?正数则直接显示十进制小数的尾数值D100=1199;

?负数则先求补码,再显示十进制小数的尾数值D100;(显示数值前

面加负号);

◆十进制小数的总体表示形式为:

1+

-Dn

Dn,具体的即:D100-D101;此

实验结果为1199-3;

◆十进制小数用LED数码显示器显示(结合硬件I/O图查看):

?先对Dn(十进制小数尾数,经正负判别与求补码处理D100)进行

常规处理显示(BCD或SEGD等);注意数值前面需加负号与否;

?再对Dn+1(十进制小数指数,经正负判别与求补码处理D101)进

行常规处理显示(BCD或SEGD等);注意数值前面需加负号与否;

◆十进制小数用组态王显示监控:

?按十进制小数的总体表示形式:

1+ -Dn

Dn;设置Dn变量(D100)、Dn+1变量(D101);并在画面按上述形式制作D100-D101;显示结

果为1199-3;

3、PLC程序、解说及仿真

4、组态王监控图(略)

5、LED 数码显示器显示硬件I/O 图 BCD译码

8

Y0Y1Y2Y3Y4Y5Y6Y7BCD译码

8

显示二进制小数的尾数

显示二进制小数的指数PLC FX2N

实验四 二进制浮点数运算实例

1、具体任务: 要求编制一解方程程序:6

.18723.3752.115+=

x y ;其中X :X0—X17(K4X0),由四位数字开关输入,范围为0—9999。

2、PLC 程序、解说及仿真

3、程序编制思路:

程序编程:

? 采用DMOV 指令、DFLT 指令及DEDIV 指令先产生1个二进

制小数115.2=(D26)D25;

? 采用DMOV 指令、DFLT 指令及DEDIV 指令先产生1个二进

制小数375.23=(D7)D6;

? 采用DMOV 指令、DFLT 指令及DEDIV 指令先产生1个二进

制小数187.6=(D16)D15;

? X0~X17输入数据处理:先用BIN 指令将输入的16位BCD 码

整数转换为二进制整数;再用FLT 指令将此数转换为二进制小

数形式存入(D36)D35;

? 用EDMUL 指令将(D26)D25与(D36)D35进行二进制小

数的乘法,结果存入(D41)D40中;

? 用DEADD 指令将(D41)D40与(D7)D6进行二进制小数

的加法;结果存入(D46)D45中;

? 用DEDIV 指令将(D46)D45与(D16)D15进行二进制小数

的除法,得到方程最终结果存入(D51)D50中。

◆ 方程编程运算过程:

15)16(45)46(15)16(6)7(40)41(15)16(6)7(35)36(25)26(50)51(D D D D D D D D D D D D D D D D D D D D =+=+?=

◆ 方程编程中各变量Dn 含义:

? (D26)D25=115.2;

? (D36)D35=K4X0(X0~X17)

? (D7)D6=375.23;

? (D16)D15=187.6;

? (D26)D25×(D36)D35=(D41)D40;

? (D41)D40+(D7)D6=(D46)D45;

? (D51)D50=(D46)D45÷(D16)D15;即方程最后结果;

实验五任意位浮点数(小数)的输入

一、具体任务及编程解读:

1、设置加1/加5键(INC指令/ADD指令),减1/减5键(DEC指令/SUB

指令),复位键,小数点1位键,小数点2位键,数据存入D0中;

2、减1/减5操作时,初始最大值设置为50,最小减至0;(触点比较指令)

3、加1/加5操作时,初始最小值设置为0,最大加至50;(触点比较指令)

4、减1/减

5、加1/加5操作中若D0数据需归零,可按复位键(RST指令);

5、输入一个小数点后一位的小数;(FLT指令、DEDIV指令)D20

6、输入一个小数点后二位的小数;(FLT指令、DEDIV指令)D20

7、为了二进制小数的显示,用DEBCD指令将二进制小数转变为十进制小

数;再用BON指令、NEG指令将数据变换为尾数、指数显示形式D30-D31;

二、编程思路

1、先用整数数据输入指令(如加1/加n、减1/减n指令,TKY指令、HKY

指令、DSW指令等等)输入整数(即需输入的整数连小数,先不考虑小

数点)至Dn;

2、再在外部Xn选择小数位(n位),编程处理存入Dm中,实现了小数的

输入。

三、PLC程序及解说、仿真:

附1:20

一、实验要求

显示一个含有小数点的实数,如12.6、23.8、5.6等。

二、实验实现分析

◆ 对于共阴LED 数码显示器,将整数中最后一位的h (小数点)引脚通过

一个限流电阻接+Vcc 即可;其他硬件电路都类同;并且无需在软件中作任何处理。

◆ 对于共阳LED 数码显示器,将整数中最后一位的h (小数点)引脚通过

一个限流电阻接地即可;其他硬件电路都类同;并且无需在软件中作任何处理。

三、实验电路图 +Vcc

+Vcc Y0

Y1Y2Y3

Y4

Y5

Y6COM

PLC

FX2N

CD4511BCD译码

88整数十位小数位共阴h +Vcc

8

整数个位

附2:PLC (FX2N )中输入小数小结、要点:

◆ FX2N 中可外部输入或内部产生1个二进制小数或十进制小数; ◆ PLC 外部输入小数方案:

? 外部(Xn )按常规方法输入整数至PLC 的Dn 中,

? 再在PLC 中用FLT 指令的将整数转化为二进制小数形式,再用

DEDIV 指令来确定二进制小数的的位数;

? 还有第二种方法,可见前面论述,略;

? 若需转化为十进制小数,则可用DEBCD 指令将二进制小数转化为十

进制小数;

? 注:因二进制小数在PLC 内部可直接进行运算,而十进制小数则直

接不行,故需要小数往往首选二进制小数;

◆ PLC 内部产生小数方案:

? 内部先用MOV 指令在Dn 中存入一个整数,

? 再用FLT 指令的将整数转化为二进制小数形式,再用DEDIV 指令来

确定二进制小数的的位数;

? 还有第二种方法,可见前述,略;

? 若需转化为十进制小数,则可用DEBCD 指令将二进制小数转化为十

进制小数;

?注:因二进制小数在PLC内部可直接进行运算,而十进制小数则直

接不行,故需要小数往往首选二进制小数;

◆PLC内部小数的运算:

?PLC内部二进制小数可直接运算:如加减乘除比较等等;

?而十进制小数则不能直接运算,需用DEBIN指令将其转化为二进制

小数后进行;

?数据为K、K常数则可直接参与运算,无需转化;

?二进制小数运算时,大多为32位,指令前应加D;并且运算结果存

储的的存储器为连续编号的2个(Dn+1)Dn;高位在大编号、低位

在小编号;程序语句上只需写小编号Dn;

?遇到在PLC内部需要运算处理的工程小数,先需确定是属于何种性

质(二进制小数、十进制小数),再作运算或变换后运算;

?遇到在PLC内部需要运算的1个工程小数、1个为整数,工程小数

得判断是否为二进制小数,否则即为十进制小数,用DEBCD指令转

化之、整数则需将整数用FLT指令转化为二进制小数,二者才可进

行运算处理。

◆FLT指令提要:

?FLT指令仅是将二进制整数转化为二进制小数表现形式,

?使用时需据二进制整数大小(占一个D16位、还是占二个D32位)

前面加D还是不加;

?经FLT指令转化后的二进制小数一般占连续2个Dn;

?要将经FLT指令转化而来的二进制小数形式的(Dn+1)Dn,得到

是几位小数的值,可用DEDIV指令,除10得到1位小数,除100

得到2位小数,以此类推;

◆二进制小数的要点:二进制小数可在FX2N中直接进行四则运算,可直

接在PLC软件中仿真显示结果;但在组态王等监控易出现乱码;需用DEBCD指令将其转化为十进制小数后以尾数、指数形式显示监控结果;

二进制小数为32位数,占用连续标号的二个Dn,最高位为符号位(1为负数、0为正数),余下的数值位:次高及下8位为指数段,剩余的为23位为尾数段;组态王上较难显示;

◆十进制小数的要点:十进制小数不能在FX2N中直接进行四则运算,需

用DEBIN指令转化为二进制小数后进行;但十进制小数在PLC仿真软件中仿真显示是乱码,但可以尾数、指数形式在组态王等显示监控结果;

十进制小数为32位数,占用连续标号的二个Dn,大编号的Dn+1存放指数段,小编号的Dn存放尾数段,可用Dn-Dn+1显示十进制小数;

第5章-C语言程序设计(第2版)教材习题答案

【教材】《C语言程序设计(第2版)》清华大学出版社,黄保和,江弋编著。2011年10月第二版。ISBN:978-7-302-26972-4。售价:35元。 【答案版本】本习题答案为2012年2月修订版本。 一、选择题 1. 设有程序段”int k=10; while(k=0) k=k-1;”,则下面叙述正确的是D)循环体语句一次也不执行。 A. while循环执行10次 B. 循环是无限循环 C. 循环体语句执行一次 D. 循环体语句一次也不执行 2. 设有程序段”int x=0,s=0;while(!x!=0) s+=++x; printf(“%d”,s);”则A)运行程序段后输出1。 A. 运行程序段后输出1 B. 程序段执行无限次 C. 运行程序段后输出0 D. 程序段中的控制表达式是非法的 3. 下面循环语句中,错误的是D) int a=1,b=2;do b-- while(b= =0);。 A. int a=1,b=2; while(b--); B. int a=1,b=2; do a++; while(a==b); C. int a=1,b=2; while(a=3); D. int a=1,b=2; do b-- while(b==0); 4. 已知”int i=5;”,下列do…while循环语句的循环次数为C) 5。 do{ printf(“%d\n”,i--); } while(i!=0); A. 0 B. 1 C. 5 D. 无限 5. 循环语句”for(int i=0,j=10; i==j; i++,j--)”的循环次数是A) 0。 A. 0 B. 5 C. 10 D. 无限 6. 下述有关break语句的描述中,不正确的是C) break语句用于if语句的内嵌语句内,它结束该if语句。 A. break语句用于循环体内,它将结束该循环 B. break语句用于开关语句,它结束该开关语句 C. break语句用于if语句的内嵌语句内,它结束该if语句 D. break语句在一个循环体内可使用多次 7. 下面关于循环语句的描述中,错误的是B)循环体内必须同时出现break语句和continue 语句。 A. 循环体内可以包含有循环语句 B. 循环体内必须同时出现break语句和continue语句 C. 循环体内可以出现选择语句 D. 循环体可以是空语句 8. 以下不是死循环的是D)for(;(c=getchar()!=’\n’);)printf(“%c”,c);。 A. for(; ; x+=i); B. while(1) { x++; } C. for( i=10; ; i--) sum+=i; D. for( ; (c=getchar() )!=’\n’ ; ) printf( “%c”,c); 9. 执行语句”for(i=0;i++<3;);”后,变量i的值为C) 4。 A.2 B. 3 C. 4 D. 5 10.语句”for(x=0,y=0;y!=1&&x<4;x++);”是C)循环4次。 A. 无限循环 B. 循环次数不定 C. 循环4次 D. 循环3次

浮点数结构详解

附录D What Every Computer Scientist Should Know About Floating-Point Arithmetic 注 – 本附录是对论文《What Every Computer Scientist Should Know About Floating- Point Arithmetic》(作者:David Goldberg,发表于 1991 年 3 月号的《Computing Surveys》)进行编辑之后的重印版本。版权所有 1991,Association for Computing Machinery, Inc.,经许可重印。 D.1摘要 许多人认为浮点运算是一个深奥的主题。这相当令人吃惊,因为浮点在计算机系统中是普 遍存在的。几乎每种语言都有浮点数据类型;从 PC 到超级计算机都有浮点加速器;多 数编译器可随时进行编译浮点算法;而且实际上,每种操作系统都必须对浮点异常(如 溢出)作出响应。本文将为您提供一个教程,涉及的方面包含对计算机系统设计人员产生 直接影响的浮点运算信息。它首先介绍有关浮点表示和舍入误差的背景知识,然后讨论 IEEE 浮点标准,最后列举了许多示例来说明计算机生成器如何更好地支持浮点。 类别和主题描述符:(主要)C.0 [计算机系统组织]:概论—指令集设计;D.3.4 [程 序设计语言]:处理器—编译器,优化;G.1.0 [数值分析]:概论—计算机运算,错 误分析,数值算法(次要) D.2.1 [软件工程]:要求/规范—语言;D.3.4 程序设计语言]:正式定义和理论— 语义;D.4.1 操作系统]:进程管理—同步。 一般术语:算法,设计,语言 其他关键字/词:非规格化数值,异常,浮点,浮点标准,渐进下溢,保护数位,NaN, 溢出,相对误差、舍入误差,舍入模式,ulp,下溢。 D-1

教材程序设计题答案

1.设计程序:z=f(x,y)=(3.14*x-y)/(x+y),若x、y取值为区间[1,6]的整数,找出使z取最小值的x1、y1,并将x1、y1以格式"%d,%d"写入到考生目录中Paper子目录下的新建文件design.dat中。 #include void main() { FILE *p; float f(float x,float y),min; int x,y,x1,y1; p=fopen("design.dat","w"); /*注意这里的路径根据考试环境改为考生文件夹路径*/ min=f(1,1);x1=y1=1; for(x=1;x<=6;x++) for(y=1;y<=6;y++) if(f(x,y)b[j]) {temp=b[i]; b[i]=b[j]; b[j]=temp; } for(i=0;i

浮点数的表示和基本运算

浮点数的表示和基本运算 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 S P M 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M表示公式偏移量 1823(-1)S*2(P-127)*1.M127 11152(-1)S*2(P-1023)*1.M1023 以单精度浮点数为例,可以得到其二进制的表示格式如下 S(第31位)P(30位到 23位) M(22位到 0位) 其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1.) 为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储和表示的。 2 浮点数的表示约定 单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。 (1) 当P = 0, M = 0时,表示0。 (2) 当P = 255, M = 0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。

(3) 当P = 255, M != 0时,表示NaN(Not a Number,不是一个数)。 当我们使用.Net Framework的时候,我们通常会用到下面三个常量 Console.WriteLine(float.MaxValue); // 3.402823E+38 Console.WriteLine(float.MinValue); //-3.402823E+38 Console.WriteLine(float.Epsilon); // 1.401298E-45 //如果我们把它们转换成双精度类型,它们的值如下 Console.WriteLine(Convert.ToDouble(float.MaxValue)); // 3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45 那么这些值是如何求出来的呢? 根据上面的约定,我们可以知道阶码P的最大值是11111110(这个值是254,因为255用于特殊的约定,那么对于可以精确表示的数来说,254就是最大的阶码了)。尾数的最大值是11111111111111111111111。 那么这个最大值就是:0 11111110 11111111111111111111111。 也就是 2(254-127) * (1.11111111111111111111111)2 = 2127 * (1+1-2-23) = 3.40282346638529E+38 从上面的双精度表示可以看出,两者是一致的。最小的数自然就是- 3.40282346638529E+38。 对于最接近于0的数,根据IEEE754的约定,为了扩大对0值附近数据的表示能力,取阶码P = -126,尾数 M = (0.00000000000000000000001)2 。此时该数的二进制表示为:0 00000000 00000000000000000000001 也就是2-126 * 2-23 = 2-149 = 1.40129846432482E-45。这个数字和上面的Epsilon 是一致的。 如果我们要精确表示最接近于0的数字,它应该是 0 00000001 00000000000000000000000 也就是:2-126 * (1+0) = 1.17549435082229E-38。 3 浮点数的精度问题 浮点数以有限的32bit长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。特定精度下看似

《Python程序设计》习题与答案

《Python程序设计》习题与参考答案 第1章基础知识 1.1 简单说明如何选择正确的Python版本。 答: 在选择Python的时候,一定要先考虑清楚自己学习Python的目的是什么,打算做哪方面的开发,有哪些扩展库可用,这些扩展库最高支持哪个版本的Python,是Python 2.x还是Python 3.x,最高支持到Python 2.7.6还是Python 2.7.9。这些问题都确定以后,再做出自己的选择,这样才能事半功倍,而不至于把大量时间浪费在Python的反复安装和卸载上。同时还应该注意,当更新的Python版本推出之后,不要急于更新,而是应该等确定自己所必须使用的扩展库也推出了较新版本之后再进行更新。 尽管如此,Python 3毕竟是大势所趋,如果您暂时还没想到要做什么行业领域的应用开发,或者仅仅是为了尝试一种新的、好玩的语言,那么请毫不犹豫地选择Python 3.x系列的最高版本(目前是Python 3.4.3)。 1.2 为什么说Python采用的是基于值的内存管理模式? 答: Python采用的是基于值的内存管理方式,如果为不同变量赋值相同值,则在内存中只有一份该值,多个变量指向同一块内存地址,例如下面的代码。 >>> x = 3 >>> id(x) 10417624 >>> y = 3 >>> id(y) 10417624 >>> y = 5 >>> id(y) 10417600 >>> id(x) 10417624 1.3 在Python中导入模块中的对象有哪几种方式? 答:常用的有三种方式,分别为 import 模块名[as 别名]

●from 模块名import 对象名[ as 别名] ●from math import * 1.4 使用pip命令安装numpy、scipy模块。 答:在命令提示符环境下执行下面的命令: pip install numpy pip install scipy 1.5 编写程序,用户输入一个三位以上的整数,输出其百位以上的数字。例如用户输入1234,则程序输出12。(提示:使用整除运算。) 答: 1)Python 3.4.2代码: x = input('Please input an integer of more than 3 digits:') try: x = int(x) x = x//100 if x == 0: print('You must input an integer of more than 3 digits.') else: print(x) except BaseException: print('You must input an integer.') 2)Python 2.7.8代码: import types x = input('Please input an integer of more than 3 digits:') if type(x) != types.IntType: print 'You must input an integer.' elif len(str(x)) != 4: print 'You must input an integer of more than 3 digits.' else: print x//100

浮点数表示方法与运算

在计算机系统的发展过程中,曾经提出过多种方法表达实数,典型的比如定点数。在定点数表达方式中,小数点位置固定,而计算机字长有限,所以定点数无法表达很大和很小的实数。最终,计算机科学发展出了表达范围更大的表达方式——浮点数,浮点数也是对实数的一种近似表达。 1.浮点数表达方式 我们知道任何一个R 进制数N 均可用下面的形式表示:N R =±S ×R ±e 其中,S—尾数,代表N 的有效数字; R—基值,通常取2、8、16;e—阶码,代表N 的小数点的实际位置(相当于数学中的指数)。 比如一个十进制数的浮点表达1.2345×102,其中1.2345为尾数,10为基数,2为阶码。一个二进制数的浮点表达0.001001×25,0.001001为尾数,2为基数,5为阶码;同时0.001001×25也可以表示成0.100100×23,0.100100为尾数,2为基数,3为阶码。浮点数就是利用阶码e 的变化达到浮动小数点的效果,从而灵活地表达更大范围的实数。 2.浮点数的规格化 一个数用浮点表示时,存在两个问题:一是如何尽可能多得保留有效数字;二是如何保证浮点表示的唯一。 对于数0.001001×25,可以表示成0.100100×23、0.00001001×27等等,所以对于同一个数,浮点有多种表示(也就是不能唯一表示)。另外,如果规定尾数的位数为6位,则0.00001001×27会丢掉有效数字,变成0.000010×27。因此在计算机中,浮点数通常采用规格化表示方法。 当浮点数的基数R 为2,即采用二进制数时,规格化尾数的定义为:1/2<=|S|<1。若尾数采用原码(1位符号位+n 位数值)表示,[S]原=S f S 1S 2S 3…S n (S f 为符号位的数符),则满足S 1=1的数称为规格化数。即当尾数的最高有效位S 1=1,[S]原=S f 1S 2S 3…S n ,表示该浮点数为规格化数。对0.001001×25进行规格化后,表示为0.100100×23。 3.浮点数的表示范围 求浮点数的表示范围,实质是求浮点数所能表示的最小负数、最大负数、最小正数和最大正数。

接口与程序设计作业(附答案)

习题1(教材P56) 1.8086/8088微处理器地址总线有多少位?寻址范围是多少? 答:20位 A019。寻址范围00000 2.8086/8088微处理器分哪两部分?各部分主要由什么组成? 答:执行单元和总线接口单元。 包括:、寄存器组、暂存器、标志寄存器、控制单元。 包括:指令队列缓冲器、段寄存器及指令指针、总线地址加法器、总线控制逻辑。 4.8086/8088微处理器中有几个通用寄存器?几个变址寄存器?有几个指针寄存器?几个段寄存器? 答:8个通用寄存器、、、、、、、。2个变址寄存器、。2个指针寄存器、。、、、段地址寄存器。 5.8086/8088微处理器中有哪些标志位?它们的含义和作用如何? 答:零标志位、进位标志、溢出标志位、辅助进位标志位、奇偶标志位、符号标志位、方向标志位、中断允许标志位、跟踪标志。 6.试求出下列运算后的各个状态标志,说明进位标志和溢出标志的区别? 12783469H 答:0001 0010 0111 1000 +0011 0100 0110 1001 0100 0110 1110 0001 0;0;0;0;1;1。 54E3H-27A0H 答:0101 0100 1110 0011 +1101 1000 0110 0000(-27A0的补码) 10010 1101 0100 0011 0;0;1;0;0;0。 H 答:0011 1000 1000 0001 +0011 0101 1001 0111 0110 1110 0001 1000 0;0;0;0;0;1。 01E301E3H 答:0000 0001 1110 0011 +1111 1110 0001 1101(-01E3H的补码) 10000 0000 0000 0000 1;0;1;0;1;1。 进位表示最高位产生进位。

vb程序设计教程教材习题答案

同步练习1 一、简答题 略 二、选择题 题号 1 2 3 4 5 6 7 8 9 10 答案 C A D B B A C D A B 题号11 12 13 14 15 答案 C B D B B 同步练习2 一、简答题 略 二、选择题 题号 1 2 3 4 5 6 7 8 9 10 答案 A B D C A C A C B C 题号11 12 13 14 15 16 17 18 19 20 答案 D A D A D B D B B B 三、填空题 1.可视 2.Left、Top;Height、Width 3.按字母序 4.查看代码 5.工具|选项|编辑器 6.Form窗体;Font 7.MultiLine 8.只能在设计状态下设置 9.工程|工程属性|通用;Form.Show 10.TabIndex;0

同步练习3 一、简答题 略 二、选择题 题号 1 2 3 4 5 6 7 8 9 10 答案 B C A D B A D B B C 题号11 12 13 14 15 16 17 18 19 20 答案 D B C B A D A A B B 三、填空题 1.整型、长整型、单精度、双精度 2.Sin(30*3.14/180)+sqr(x+exp(3))/abs(x-y)-log(3*x) 3.①160;②今天是:10-9 4.false 5.-4、3、-3、3、-4、4 6.CDEF 7.(x mod 10)*10+x\10 8.(35\20)*20=20;( 35 \ 20 )* 20 = 20 9.x mod 3=0 or x mod 5=0 10.①27.6 ②8.2 ③8 ④ 1 ⑤100 ⑥397 ⑦True ⑧False 同步练习4 一、选择题 题号 1 2 3 4 5 6 7 8 9 10 答案 D B C A D A B C A B 题号11 12 13 14 15 16 17 18 19 20 答案 D A B A C C B A C B 题号21 22 23 24 25 答案 D A B B C

浮点数的加减乘除运算步骤

设两个浮点数X=Mx※2Ex Y=My※2Ey 实现X±Y要用如下5步完成: ①对阶操作:小阶向大阶看齐 ②进行尾数加减运算 ③规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位的补码尾数来说,就必须是001×××…×× 或110×××…××的形式, 若不符合上述形式要进行左规或右规处理。 ④舍入操作:在执行对阶或右规操作时常用“0”舍“1”入法将右移出去的尾数数值进行舍入,以确保精度。 ⑤判结果的正确性:即阶码是否溢出 若阶码下溢(移码表示是00…0),要置结果为机器0; 若阶码上溢(超过了阶码表示的最大值)置溢出标志。 例题:假定X=0 .0110011*211,Y=0.1101101*2-10(此处的数均为二进制)?? 计算X+Y;解:[X]浮:0 1010 1100110 [Y]浮:0 0110 1101101 符号位阶码尾数 第一步:求阶差:│ΔE│=|1010-0110|=0100 第二步:对阶:Y的阶码小,Y的尾数右移4位 [Y]浮变为0 1010 0000110 1101暂时保存 第三步:尾数相加,采用双符号位的补码运算 00 1100110 +00 0000110 00 1101100 第四步:规格化:满足规格化要求 第五步:舍入处理,采用0舍1入法处理 故最终运算结果的浮点数格式为:0 1010 1101101, 即X+Y=+0. 1101101*210

①阶码运算:阶码求和(乘法)或阶码求差(除法) 即[Ex+Ey]移= [Ex]移+ [Ey]补 [Ex-Ey]移= [Ex]移+ [-Ey]补 ②浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理 例题:X=0 .0110011*211,Y=0.1101101*2-10 求X※Y 解:[X]浮:0 1 010 ******* [Y]浮:0 0 110 1101101 第一步:阶码相加 [Ex+Ey]移=[Ex]移+[Ey]补=1 010+1 110=1 000 1 000为移码表示的0 第二步:原码尾数相乘的结果为: 0 10101101101110 第三步:规格化处理:已满足规格化要求,不需左规,尾数不变,阶码不变。第四步:舍入处理:按舍入规则,加1进行修正 所以X※Y= 0.1010111※2+000

《Visual Basic程序设计基础》教材习题参考答案

《Visual Basic程序设计基础》教材 习题参考答案 第1章 Visual Basic 6.0程序设计概述 一、判断题 1.√2.√ 3.×说明:同类控件(如两个标签)相互重叠,设计时可以设置“置前”、“置后”属性。4.√5.×6.√7.×8.√9.√10.×11.√12.√13.×14.√15.×16.√17.√18.√19.√20.√ 二、选择题 1. C 2. B 3.D 4.C 5.B 6.A 7.D 8.A 9.B 10.A 11.C 12.D 三、填空题 1.对象、事件2.属性、方法、事件3.控件、屏幕(Screen) 4.对象5.Left、Top 6.属性、<对象名>.<属性名>=<表达式> 7.网格8.F orm1 9.Load或Initialize或Resize或Activate(自动执行的先后顺序也按此排列)10.Activate、Deactivate 四、程序设计题 程序1.界面设计参看图10-1、10-2以及表10-1。 表10-1 实例2各控件的主要属性设置 过程设计如下: Private sub Form_Click() Command2.Enabled = False Een Sub Private Sub Command1_Click() Label2.Visible = False Label1.Caption = Text1.Text + ": 欢迎使用" + Label1.Caption Text1.Visible = False Command1.Enabled = False: Command2.Enabled = True End Sub Private Sub Command2_Click()

浮点数计算方式

2.3.4二进制转10进制及10进制转为二进制 【例2-3-4】 把二进制110.11转换成十进制数,及十进制转为二进制。 解: (110.11)2 =1×22+1×21+1×20+1×2-1+1×2-2 =4+2+0+0.5+0.25=(6.75)10 把十进制转换为二进制 解: 2 6 0 2 3 1 1 1 所以实数部分为110 0.75×(2×2-1)=0.75×2×2-1 =1×2-1+0.5×2-1 =1×2-1+1×2-2 所以结果为:(110.11)2 2.3.5 浮点数在计算机中存储形式 当前主流微机中广泛采用的IEEE754标准浮点格式。 按IEEE754标准,常用的浮点数(32位短实数)的格式如图2-3所示。

IEEE754标准浮点格式 N=2e.M (M为浮点尾数,为纯小数,e为浮点数的指数(阶码))尾数部分决定了浮点数的精度,阶码决定了表示范围32为浮点数(IEEE754标准格式0—22为尾数M,23-30为阶码E,31为符号位S),阶码用移码表示。阶码E=指数真值e+127 规格化真值x=(-1)^S*(1.M)*2^(E-127) 将(82.25)10 转换成短浮点数格式。 1)先将(82.25)10 转换成二进制数 (82.25)10 =(1010010.01)2 2)规格化二进制数(1010010.01)2 1010010.01=1.01001001×2 6 尾数M=01001001 3)计算移码表示的阶码=偏置值+阶码真值: E=127+6=133=10000101 4)以短浮点数格式存储该数 因此:符号位=0 S=0表示该数为正数 阶码=10000101 由3)可得 尾数=01001001000000000000000 由2)可得;尾数为23位, 不足在后面添15位0 所以,短浮点数代码为: 0;10000101;01001001000000000000000 表示为十六进制代码为:42A48000H

《C语言程序设计》课后习题参考答案

高等院校计算机基础教育规划教材《C++程序设计》课后习题参考答案 ――武汉大学出版社 习题1参考答案 一、选择题 1. A 2. D 二、填空题 1.BASIC、FORTRAN、AL_GOL60和COBOL 2. 8 3.关键字 4. 编辑、编译、链接和运行 三、简答题 1.答: (1)C语言具有结构化的控制语句。C语言提供了结构化程序所必需的基本控制语句,实现了对逻辑流的有效控制。 (2)C语言具有丰富的数据结构类型。C语言除提供整型、实型、字符型等基本数据类型外,还提供了用基本数据类型构造出的各种复杂的数据结构,如数组、结构、联合等。C语言还提供了与地址密切相关的指针类型。此外,用户还可以根据需要自定义数据类型。 (3)C语言具有丰富的运算符。C语言提供了多达34种运算符,丰富的数据类型与丰富的运算符相结合,使C语言的表达力更具灵活性,同时也提高了执行效率。 (4)C语言简洁、紧凑,使用方便、灵活,程序书写自由,有9种控制语句。 (5)C语言既具有高级语言的功能,又具有低级语言的许多功能,通常被称为中级计算机语言。它既是成功的系统描述语言,又是通用的程序设计语言。 (6)C语言与汇编语言相比,可移植性好。 (7)功能强大。C语言具有低级语言的一些功能,所以,生成目标代码质量高,程序执行效率高。现在许多系统软件都用C语言来描述,可以大大提高了编程效率。 2.答:运行一个C语言程序,一般需要经过如下几个步骤:①上机输入并编辑源程序;②编译源程序;③与库函数连接;④生成可执行目标程序;⑤运行目标程序。 3.答: (1)操作系统的设计与实现。C语言是一种应用非常广泛的结构化高级程序设计语言,既适合编写应用软件,又适合编写系统软件。

浮点数在计算机中的存储方式

C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE 的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。 无论是单精度还是双精度在存储中都分为三个部分: 1.符号位(Sign) : 0代表正,1代表为负 2.指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移 位存储 3.尾数部分(Mantissa):尾数部分 其中float的存储方式如下图所示: 而双精度的存储方式为: R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25 用十进制的科学计数法表示就为:8.25*,而120.5可以表示 为:1.205*,这些小学的知识就不用多说了吧。而我们傻蛋计算机根本不认 识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,我靠,不会连这都不会转换吧?那我估计要没辙了。120.5用二进制表示为:1110110.1用二进制的科学计数法表示1000.01可以表示为

1.0001*,1110110.1可以表示为1.1101101*,任何一个数都的科学计 数法表示都为1.xxx*,尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127,下面就看看8.25和120.5在内存中真正的存储方式。 首先看下8.25,用二进制的科学计数法表示为:1.00001* 按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,位数部分为,故8.25的存储方式如下图所示: 而单精度浮点数120.5的存储方式如下图所示:

《Visual Basic程序设计基础》教材习题参考答案第七章

第7章对话框与菜单程序设计 一、判断题 1.√2.√3.√4.×5.×6.×7.√8.√9.√10.√ 二、选择题 1.D 2.A 3.C 4.C 5.B 6.D 7.A 8.B 9.D 10.B 三、填空题 1.窗体控制菜单、下拉式菜单、快捷菜单2.ShowFont 3.打开文件、另存为、颜色、字体、打印对话框4.工程、部件 5.CommonDialog1.Action =3、CommonDialog1.ShowColor 6.提示信息、对话框类型、对话框标题7.Click 8.工具9.代码窗口、Click 10.相同、正 四、程序阅读题 程序1. 显示提示信息为“5”、标题为“na的输出结果”、有一个“确定”按钮的消息框。 程序2. 显示提示信息为“您选择了第1项”、标题为“第一项”、有一个“确定”按钮的消息框。 五、程序填空题 1.(1)Int(Rnd*100) (2)Str(i) (3)Exit For 2.(1)False (2)Date (3)CommonDialog1.Color (4)m1 六、程序设计题 程序1.界面设计略,过程设计如下: Private Sub Command1_Click() CommonDialog1.ShowOpen List1.AddItem CommonDialog1.FileName End Sub 程序2.界面设计略,过程设计如下: Private Sub Command1_Click() CommonDialog1.ShowSave List1.AddItem CommonDialog1.FileName End Sub 程序3.界面设计如图10-9、表10-2所示,过程设计如下: Private Sub Sqr_Click() Shape1.Shape = 1 End Sub Private Sub Rec_Click() Shape1.Shape = 0 End Sub Private Sub Oval_Click() Shape1.Shape = 2 End Sub

浮点运算

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,那就是用固件库自带的优化函数来解决问题。

《C语言程序设计基础》教材参考答案-20140211要点

《C语言程序设计基础》教材 参考答案 包括各单元: 一.随堂练习 二.单元总结 三.单元练习 四.实训指导

单元一程序设计宏观认识 一.随堂练习 【随堂练习1-1】 1.根据上述示例模仿编程,输入正方形的边长,计算其面积。 #include void main( ) { int a,s; //数据准备,边长a,面积s printf("请输入正方形的边长:"); scanf("%d",&a); //数据输入 s=a*a; //数据计算 printf("该正方形的面积为:%d.\n",s); } 【随堂练习1-2】 1.下面哪些标识符属于合法的用户自定义标识符: Main、void、_num、my$、a*、N4、3m、a-2 答:合法的用户自定义标识符是:Main、_num、N4 2.结合【例1.2】指出程序代码中所用到的标识符哪些是关键字,哪些是预定义标识符,哪些是用户自定义标识符。 答:关键字:void、int 预定义标识符:include、main、printf、scanf 用户自定义标识符:a、b、c 3.分析【例1.2】中函数的结构,包括函数首部(函数返回值类型、函数名、形式参数)、函数体语句(说明语句、可执行语句)。 答:函数首部:void main( ),其中函数返回值类型为void、函数名为main、形式参数无; 函数体语句:{}内的语句为函数体,其中:说明语句为int a,b,c;,其余为可执行语句。 【随堂练习1-3】 1.在VC++6.0环境中完成【例1.2】程序开发过程。 (略) 2.查阅【例1.2】所对应的工程文件夹,了解相关文件的含义。

浮点数的加减法运算

计算机组成与结构 之 浮点数的加减法运算 学生组所在学院:燕山大学信息学院 学生组所在班级:2014级计算机1 班 学生组姓名:陈朝俊张海傅晓欣曲佳彤

地址:中国河北省秦皇岛市河北大街438号邮编:066004 电话: 传真: 网址:

浮点数加减法运算简介 大型计算机和高档微型机中,浮点加减法运算是由硬件完成的。低档的微型机浮点加减法运算是由软件完成的,但不论用硬件实现还是软件实现,基本原理是一致的。 浮点加减法运算要经过对阶、尾数加减运算、结果规格化、舍入处理、溢出判断五步操作。其中尾数运算与定点加减法运算相同,而对阶、规格化、舍入和溢出判断,则是浮点加减法运算和定点加减法运算不同的操作之处。 在补码浮点运算中,阶码与尾数可以都用补码表示。在硬件实现的运算中,阶码和数符常采用双符号位。 浮点数的表示形式 浮点数的表示形式(假设以2为底): N=M·2E 其中,M为浮点数的尾数,一般为绝对值小于1的规格化二进制小数,用原码或补码形式表示;E为浮点数的阶码,一般是用移码或补码表示的整数。 阶码的底除了2以外,还有用8或16表示的,这里暂且只以2为底进行讨论。

浮点数加减法运算的步骤 设两浮点数X、Y进行加减运算,其中:X=M X·2EX,Y=M Y·2EY 一般由以下五个步骤完成:

规 格 化 浮 点 数 加 减 运 算 流 程 一、对阶 1.对阶是指将两个进行运算的浮点数的阶码对齐的操作。对阶的目

的是为了使两个浮点数的尾数能够进行加减运算。因为,当进行MX·2EX 与MY·2EY加减运算时,只有使两浮点数的指数值部分相同,才能将相同的指数值作为公因数提出来,然后进行尾数的加减运算。 2.对阶的具体方法是:首先求出两浮点数阶码的差,即ΔE=Ex-Ey,将小阶码加上ΔE,使之与大阶码相等,同时将小阶码对应的浮点数的尾数右移ΔE位,以保证该浮点数的值不变。 3.几点注意: (1)对阶的原则是小阶对大阶,因为若大阶对小阶,则尾数的数值部分的高位需移出,而小阶对大阶移出的是尾数的数值部分的低位,这样损失的精度更小。 (2)若ΔE=0,说明两浮点数的阶码已相同,无需再做对阶操作。(3)尾数右移时,对原码表示的尾数,符号位不参加移位,尾数数值部分的高位补0;对补码表示的尾数,符号位参加右移,并保持原符号位不变。 (4)由于尾数右移时是将最低位移出,会损失一定的精度,为减少误差,可先保留若干移出的位,供以后舍入处理用。 二、尾数的加减运算

浮点运算

简介 当我们用不同的电脑计算圆周率时,会发现一台电脑的计算较另一台来讲结果更加精确。或者我们在进行枪战游戏的时候,当一粒子弹击中墙壁时,墙上剥落下一块墙皮,同样的场面在一台电脑上的表现可能会非常的呆板、做作;而在另外一台电脑上就会非常生动形象,甚至与我们在现实中看到的所差无几。这都是浮点运算能力的差异导致的。 定点与浮点 大学计算机基础中已经了解过计算机的实数表示方法可分为两种即定点与浮点 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、定点数与浮点数区别 定点表示法运算直观,但数的表示范围较小,不同的数运算时要考虑比例因子的选取,以防止溢出。浮点表示法运算时可以不考虑溢出,但浮点运算,编程较难。要掌握定、浮点数的

自考教材《java语言程序设计(一)》第三章习题解答

第三章习题解答 3.1什么是面向对象技术?它有什么优点? 通过面向对象的方式,将现实世界的物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。程序设计者考虑的是对象的描述、对象间的关系、类的管理、什么时候和什么地方调用对象的哪一种方法。 面向对象技术的最大优点是有效支持重用,使得大的程序也变得相对容易维护。 3.2面积对象的程序设计和面向过程的程序设计有什么区别? 面向过程语言编程模式是: 程序=数据结构+算法 编程时需要考虑和内容是的程序什么、怎么做、重点考虑每个实现的细节。 面向对象的语言的编程模式是: 程序=对象+消息 程序设计者考虑的是对象的描述、对象间的关系、类的管理、什么时候和什么地方调用对象的哪一种方法。 3.3在程序中类和对象有什么区别? 类是同一种对象的描述,类概括了同类对象的共有性质:数据和方法。类的每个对象都有自己的标识,但它们具有相同的一级属性和提供相同的方法。 在程序中,对象的名称用于捐弃引用对象,对象的成员变量用于存储对象的状态值,对象和方法用于描述对象的行为。 3.4 类变量和实例变量,以及类方法和实例方法的区别。 加载类之前创建对象之后调用方法访问权限 成员变量实例变量不分配内存 各个对象之间各 自分配独立的内 存空间 对象名.实例变量 名 被实例方法,构造方 法访问 类变量 直接分配内 存 各个对象之间共 享这段已经分配 完的内存 对象名.类变量 名;类名.类变量 名 被实例方法,类方法, 构造方法访问 成员方法实例方法 不分配入口 地址 共享一个入口地 址 对象名.实例方法 名 实例变量、类变量, 实例方法、类方法类方法 直接分配入 口地址 共享这个入口地 址 对象名.类方法 名;类名.类方法 名 类变量、类方法

相关主题
文本预览
相关文档 最新文档