当前位置:首页 > 百科

浮点运算

浮点运算就是实数运算,因为计算机只能存储整数,所以实数都是约数,这样浮点运算是很慢的而且会有误差。现在大多数机来自器都是32位的,也就是说32位都用来表示整数的话,那么对于无符号整数就是0 到 2^32-1,对于有符号的话就是-2^31 到 2^31-1。

  • 中文名 浮点运算
  • 性 质 实数运算
  • 原 因 计算机只能存储整数
  • 特 点 实数都是约数

简介

  浮点运算就是实数运算。浮点运算是高精度的运算方式,主要运用来自在科学和多媒体中。可以理解为小数点可移动的运算方式。

  数和计算通常是按“整数”360百科或“浮点数”进行划分的。整数计算使用计算的所有位记录易既还整数“值”。而浮点计算则使用计算的一部分位表示“值”,另一部分位表示指数。由于一部分位用来表示向率美径缺指数,所以浮点计算得出的值可以比整数计算得出的值大很多或是小很多。换句话说,对于给定数量的位,浮点计否案确而算的精度没有整数计算高,但浮点计算结果的范围却比整数计算大很多。

计算精度

  采用浮点计算时,可以确定记录多少个数。例如,“π”的一个相当长的表示是3.141592653589得构到级收副创79323846264338327950288419716939937510。问题是您想/需要记录π的几位数和想让精确度达到多少。

  π的上述值是51位数。要将51位数表示成纪任营都迅村手二进制数,每位数需要3.抗认粮连给间32位,总计需要51*3.32=169位。这样位数太多。您使用的位数越多,处理器计算的复杂程度凯沉广绍层粉就越高,也就需要更多的内存来存储值,比建研集广例计算所用的时间也就越长。由于各计算所需精度不同,因此处理器为不同指令提供不同的精度,从而使编程人员可以确定他们所需的精度。精度级别可分为:单精度、双精度和扩展精度。

运算数据

  FPU->Floating Point Unit,浮点运算部件

  BCD->Binary Coded Decimal 压缩的二十进制数,是用4个位来表示数字0~9,一个byte表示两个十进制数,比如01111001表示79

  浮点运算使用三种不同的来自数据:

  1、整数(Integer),又分为字,短整数(Short Integer)和长整数(Long Intege360百科r)

  2、实数(Real)分抗或减脸边养河急谈着商单精度(Single Real)依劳吃态粒孩和双精度(Double Real)

  3、压缩的二十进制数(BCD)

部件

  FPU从功能上分为两个部分:控制单元和运算单元,控制单元主要面向CPU,而算数单元负责具体算数运算.

  FPU即浮点部件包括8通用寄存器,5个错误指针寄存器和三个控制寄存器。

  1、8个通用寄存器每个80 bit,形成一个寄存征工试刑器堆栈,所有的计算结果都保存在寄存器堆栈中,其中数据全部是80位的扩展精度格式,即显来使是BCD,整数,单精度和双精度等在装入寄存器的时候都要被FPU自动转化为80位的扩展精度格式,注意栈顶通常表示为ST(0妈苦孩杂屋属取检),然后是ST(1)...ST(i),ST(i)是相对防占责步克村于栈顶而言的.

  和堆栈很相似,只不过宽度为80bit,映像如下:

  _______________________

 伯货汽算庆原湖老进直和 | ST(0) |

  |_______________________|

  | ST(1) |

  |_________________深清难派银赵次毫练清汉______|

  | ...... |

  | ...... |

  | ST(i) |

  |_______________________|

  2控制寄存器,FPU有三个控制寄存器:状态寄存器,控制寄存器和标记寄存器

  状态寄存器->SW

  _M_____D________10___9____8___7_________5_________________________0__

  | B | C3| TOP| C2 | C1 | C0 | ES | | PE | UE | OE | ZE | DE 增氧亚死曾雷经| IE |

  |____|____|____|____|____|__你或括终川雨政超字__|____|____|威陈位____|____|____|____|____|____|

  B: 浮点部件正忙

  C0-C3 指示浮点运算的结果,不同指令有不同含义

  TOP 指示栈顶,通常是0

  ES 以下任何位置位 (pe,ue,oe,ze,de,or ie) 则置位

  PE 精度故障

  UE 数字太小无法表示溢出

  OE 现有精度无法表示,数字太大溢出

  Z他秋议因E 除0错

  DE 稳便指示至少有一个操作数未规格

  IE 无效错误,指示堆栈上溢或下溢,无效操作数等

  控制寄存器:

  _哪布讨广背15_______笔为居士组好自_____10___9____8___7_________5______________模好________0__

  | |IC | RC | PC | 王三决吃跟杂出| PM | UM | OM | ZM | DM | IM |

  |____|____|____|___|__|_|__|__|____|____|____|____|____|____|____|

  IC 无穷大控制,对486,已经无效

  RC 舍入控制

  00 = 朝最接近或者偶数舍入

  01 = 朝负无穷大方向舍入

  10 = 朝正无穷大方向舍入

  11 = 超0方向截断

  PC 精度控制

  00 = 单精度

  01 = 保留

  10 = 双精度

  11 = 扩展精度

  PM~IM 屏蔽状态寄存器低5位指示的错误.为1则屏蔽.

  标记寄存器:

  每2 bit表示一个对应堆栈寄存器的状态,具体含义如下:

  15________________________________________3_____0

  |Tag7 |...................................|tag1|

  |_____|___________________________________|____|

  含义:

  00 = 有效

  01 = 零

  10 = 无效或无穷大

  11 = 为空

浮点数

  在这之前,先来看几个术语:

  FPU->Floating Point Unit,浮点运算部件

  BCD->Binary Coded Decimal 压缩的二十进制数,是用4个位来表示数字0~9,一个byte表示两个十进制数,比如01111001表示89

  浮点运算使用三种不同的数据:

  1、整数(Integer),又分为字,短整数(Short Integer)和长整数(Long Integer)

  2、实数(Real)分单精度(Single Real)和双精度(Double Real)

  3、压缩的二十进制数(BCD)

格式

  单精度:_31_30________23_22___________0

  符号 指数 有效数

  双精度:_63_62__________52_51__________________0

  符号 指数 有效数

  扩展精度数: _79_78____________64_63___________________0

  符号 指数 有效数

  例子:

  C377999A var1 dd -247.6

  40000000 var2 dd 2.0

  486F4200 var3 real4 2.45e+5

  4059100000000000 var4 dq 100.25

  3F543BF727136A40 var5 real8 0.00123

  C377999A var1 dd -247.6

  40000000 var2 dd 2.0

  486F4200 var3 real4 2.45e+5

  4059100000000000 var4 dq 100.25

  3F543BF727136A40 var5 real8 0.001235

  400487F34D6A161E4F76 var6 real10 33.9876

  DD和real4都可以在asm中来定义单精度浮点数,4 bytes

  DQ和real8都可以在asm中来定义双精度浮点数,8 bytes

  DT和real10都可以在asm中来定义扩展精度浮点数,10 bytes

指令系统

  浮点指令系统分为五类:数据传送类、算术运算类、超越函数类、比较类、环境及系统控制类.

  我并不想列出所有函数的参数以及用法,具体参考资料见文章最后.

  1、数据传送类

  这类指令主要是从内存装入浮点寄存器堆数据,一般目的地址总是栈顶ST(0),用调试器你可以清楚地看到这一点.注意带P结尾的操作,是在前面操作完成之后出栈,也就是原来ST(1)的内容现在成了ST(0)的内容,注意到这一点,你可以方便地设计出灵活多变的程序.

  装入:

  FLD Push real onto stack

  FILD Convert two's complement integer to real and push

  FBLD Convert BCD to real and push to stack

  存储:

  FST Store floating-point number from stack

  FSTP Convert top of stack to integer

  FIST

  FISTP Convert top of stack to integer

  FBSTP Store BCD to integer and pop stack

  交换:

  FXCH Exchange top two stack elements

  常数装载:

  FLD1 装入常数1.0

  FLDZ 装入常数0.0

  FLDPI 装入常数pi (=3.1415926....精度足够,放心使用)

  FLDL2E 装入常数log(2)e

  FLDL2T 装入常数log(2)10

  FLDLG2 装入常数log(10)2

  FLDLN2 装入常数Log(e)2

  2、算术运算类

  加法:

  FADD/FADDP Add/add and pop

  FIADD Integer add

  减法:

  FSUB/FSUBP Subtract/subtract and pop

  FSUBR/FSUBRP Subtract/subtract and pop with reversed operands

  FISUB Integer subtract

  FISUBR Integer subtract/subtract with reversed operands

  乘法:

  FMUL/FMULP Multiply/multiply and pop

  FIMUL Integer multiply

  除法:

  FDIV/FDIVP Divide/divide and pop

  FIDIV Integer divide

  FDIVR/FDIVRP Divide/divide and pop with reversed operands

  FIDIVR integer divide with reversed operands

  其他:

  FABS Calculate absolute value

  FCHS Change sign

  FRNDINT Round to integer

  FSQRT Calculate square root

  FSCALE Scale top of stack by power of 2

  FXTRACT Separate exponent and mantissa

  FPREM Calculate partial remainder

  FPREM1 Calculate partial remainder in IEEE format

  如果指令后面未带操作数,其默认的操作数为ST(0)和ST(1),关于带R后缀的指令是正常操作数的顺序变反,比如fsub执行的是x-y,fsubr执行的就是y-x.

  3、超越函数类

  三角函数

  FSIN Calculate sine

  FCOS Calculate cosine

  FSINCOS Calculate quick sine and cosine

  FPTAN Calculate partial tangent

  FPATAN Calculate partial arctangent

  Log类

  FYL2X Calculate y times log base 2 of x

  FYL2XP1 Calculate y times log base 2 of (x+1)

  F2XM1 Calculate (2^x)-1

  4、比较类

  FCOM Compare

  FCOMP Compare and pop

  FICOM Integer compare

  FTST Integer compare and pop

  FUCOM Unordered compare

  FUCOMP Unordered compare and pop

  FXAM Set condition code bits for value at top of stack

  FSTSW Store status word

  会根据结果设置,C0~C3,在上面并未就C0~C3进行具体介绍,C1是用来判断上溢或者下溢的,C0相当于EFLAGS里面的CF,作用也基本一致,C2相当于PF,C3相当于ZF,可能会看到如下指令

  FSTSW ax

  SAHF

  JZ label

  为什么如此呢,因为用如上指令将状态字存入EFLAGS,C0正好置于CF位,C3正好置于ZF位.

  5、环境及系统控制类

  FLDCW Load control word

  FSTCW Store control word

  FSTSW Store status word

  FLDENV Load environment block

  FSTENV Store environment block

  FSAVE Save coprocessor state

  FRSTOR Restore coprocessor state

  FINIT Initialize coprocessor

  FCLEX Clear exception flags

  FINCSTP Increment stack pointer

  FDECSTP Decrement stack pointer

  FFREE Mark element as free

  FNOP No operation

  FWAIT Wait until floating-point instruction complete

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:fendou3451@163.com
标签:

  • 关注微信
上一篇:粗放
下一篇:测试计划

相关文章