精华内容
下载资源
问答
  • 计算机组成原理第二章 第11讲 浮点运算方法和浮点运算器浮点运算方法和浮点运算器 * * 2.6 浮点运算方法和浮点运算器 定点 浮点 加 定点加减法器 浮点加减法 减 乘 原码并行乘法 直接补码乘法 浮点乘除法 除 原码除...

    计算机组成原理第二章 第11讲 浮点运算方法和浮点运算器

    浮点运算方法和浮点运算器 * * 2.6 浮点运算方法和浮点运算器 定点 浮点 加 定点加减法器 浮点加减法 减 乘 原码并行乘法 直接补码乘法 浮点乘除法 除 原码除法 并行除法器 2.6 浮点运算方法和浮点运算器 2.6.1 浮点加法、减法运算 2.6.2 浮点乘法、除法运算 2.6.3 浮点运算流水线 2.6.4 浮点运算器实例 2.6.1 浮点加法、减法运算 1、浮点加减运算 设有两个浮点数x和y,它们分别为 x=2Ex·Mx y=2Ey·My   其中Ex和Ey分别为数x和y的阶码,Mx和My为数x和y的尾数。两浮点数进行加法和减法的运算规则是:(下页例子理解) x±y= 2Ex·Mx± 2Ey·My =(Mx′ 2Ex-Ey±My)2Ey,   设Ex≤Ey 2.6.1 浮点加法、减法运算 以十进制举例: 1.2*105 + 4.7*103=? 可写为:1.2*105 + 0.047*105 =1.247*105 或者写为120*103 + 4.7*103 =124.7*103 2.6.1 浮点加法、减法运算 2、浮点运算步骤如下: 1). 0 操作数的检查,看有无简化操作的可能; 2). 比较阶码大小并完成对阶 (小阶向大阶对齐); Eg. 1.11011×210 1.11011×27 为什么不是大阶向小阶对齐? 2.6.1 浮点加法、减法运算 Eg. 1.11011×210 1.11011×27 浮点格式中,尾数的小数点位置是默认的 如果向小阶对齐,尾数就要左移,易导致高位数据丢失。 如果向大阶对齐,尾数就要右移,丢失的是低位数据 2.6.1 浮点加法、减法运算 3). 尾数进行加或减运算; 方法与定点加减法运算方法相同 4). 结果规格化 定点运算溢出,在浮点运算中要通过改变阶码实现规格化。 2.6.1 浮点加法、减法运算 (1)在浮点加减运算时,尾数求和的结果也可以得到01.ф…ф或10.ф…ф,即两符号位不等,此时将运算结果右移以实现规格化表示,称为向右规格化。 规则:尾数右移1位,阶码加1 (2)结果是00.0...01.....或11.1...10...时,则向左规格化 规则:尾数左移1位,阶码减1,直到规格化 . 2.6.1 浮点加法、减法运算 结果规格化举例 00.11011 * 23 +00.01110 * 23 =01.01001 * 23 (溢出,但可被处理) =00.101001 * 24 浮点区别于定点: 可以通过增减阶码实现尾数的移动。 2.6.1 浮点加法、减法运算 5). 舍入处理 就近舍入 朝0舍入 朝+∞舍入 朝- ∞舍入 2.6.1 浮点加法、减法运算 就近舍入: 类似于四舍五入, 比100…0大进位,比100…0小舍去 对于100……0的情况: 有效位末尾是1:进1 有效位末尾是0:舍弃 eg,保留有效位到0.001 0.10111 -0.00101 0.11110 -0.01010 2.6.1 浮点加法、减法运算 朝0舍入:即简单的截尾 保留有效位到0.001: 0.10111 -0.00101 0.11110 -0.01010 0 1 2 3 4 5 -1 -2 -3 -4 教材勘误: P53: 5)舍入处理 朝0舍入 朝+∞舍入 朝-∞舍入 2.6.1 浮点加法、减法运算 朝+∞舍入: 正数:多余位不全为”0”,进1; 负数:截尾 eg.保留有效位到0.001 0.10111 -0.00101 0.11110 -0.01010 0 1 2 3 4 5 -1 -2 -3 -4 2.6.1 浮点加法、减法运算 朝- ∞舍入: 负数:多余位不全为”0”,进1; 正数:截尾 eg.保留有效位到0.001 0.10111 -0.00101 0.11110 -0.01010 0 1 2 3 4 5 -1 -2 -3 -4 2.6.1 浮点加法、减法运算 例题: 设 x1=11 x2=11 x3=11 x4=11 求执行只保留小数点后4位有效数字的就近舍入操作值。如果朝0舍入呢? 2.6.1 浮点加法、减法运

    展开全文
  • 定点与浮点运算

    2021-09-24 19:23:11
    定点与浮点运算 文章目录定点与浮点运算1. 定点加减法2. 定点乘除法3. 定点运算器4. 浮点加减5. 浮点乘除6. 浮点运算器 1. 定点加减法 定点加法:此处指的是纯整数,加法采用补码相加 定点减法:减法采用补码相减,...

    定点与浮点运算

    1. 定点加减法

    • 定点加法:此处指的是纯整数,加法采用补码相加
    • 定点减法:减法采用补码相减,即被减数的补码加上(-减数)的补码
    • 溢出的概念:两正数相加,结果大于机器字长所能表示的最大正数,称为正溢;两负数相加,结果小于机器字长所能表示的最小正数,称为负溢;
    • 变形补码:传统补码为 [ x ] 补 码 = x + 2 n + 1 ( x < 0 ) [x]_{补码}=x+2^{n+1}(x<0) [x]=x+2n+1x<0变形补码为 [ x ] 变 形 补 码 = x + 2 n + 2 [x]_{变形补码}=x+2^{n+2} [x]=x+2n+2
    • 溢出的检测:以变形补码(增肌一个符号位)运算结果符号位出现10或01时表示溢出,并其最高符号位始终指示正确的符号
    • 基本的二进制加/减法器:FA,可在FA的基础上添加相应电路控制加减法,检测溢出(属于串行)

    2. 定点乘除法

    • 定点乘法: [ x ] 原 码 = x f x n − 1 . . . x 1 x 0 [x]_{原码}=x_f x_{n-1} ... x_1 x_0 [x]=xfxn1...x1x0 [ y ] 原 码 = y f y n − 1 . . . y 1 y 0 [y]_{原码}=y_fy_{n-1} ... y_1 y_0 [y]=yfyn1...y1y0 [ z ] 原 = ( x f ⨁ y f ) + ( x n − 1 . . . x 1 x 0 ) ( y n − 1 . . . y 1 y 0 ) [z]_{原}=(x_f \bigoplus y_f) +(x_{n-1} ... x_1 x_0)(y_{n-1} ... y_1 y_0) [z]=(xfyf)+(xn1...x1x0)(yn1...y1y0)
    • 不带符号的阵列乘法器:由FA组成的流水线阵列乘法器
    • 带符号的阵列乘法器((n+1)乘(n+1)位乘法器):在流水线阵列乘法器(n乘n位乘法器)前端加上两个n位算前求补器,在末端加上一个2n位算后求补器实现。其中个n位算前求补器的作用是将两个乘数在倍不带符号的乘法阵列相乘以前变为正整数,2n位算后求补器作用是当两个成熟的符号不一致时,把结果变换成带符号的数
    • 定点除法: [ x ] 原 码 = x f . x n − 1 . . . x 1 x 0 [x]_{原码}=x_f .x_{n-1} ... x_1 x_0 [x]=xf.xn1...x1x0 [ y ] 原 码 = y f . y n − 1 . . . y 1 y 0 [y]_{原码}=y_f.y_{n-1} ... y_1 y_0 [y]=yf.yn1...y1y0 [ z ] 原 = ( x f ⨁ y f ) + ( 0. x n − 1 . . . x 1 x 0 ) / ( 0. y n − 1 . . . y 1 y 0 ) [z]_{原}=(x_f \bigoplus y_f) +(0.x_{n-1} ... x_1 x_0)/(0.y_{n-1} ... y_1 y_0) [z]=(xfyf)+(0.xn1...x1x0)/(0.yn1...y1y0)
    • 可控加减法单元:CAS
    • 加减交替的阵列除法器:由CAS组成的流水线阵列除法器

    3. 定点运算器

    • 多功能算数/逻辑运算单元:ALU,通过函数发生器和FA组成,输入先通过函数发生器,函数发生器的输出再通过FA。可实现加减法和多种逻辑运算
    • 先行进位发生器:CLA,可与ALU组成更高位的ALU
    • 定点运算器的基本结构:运算器包括ALU,阵列乘除器,寄存器,多路开关,三态缓冲器,数据总线等
    • 不同总线结构的运算器:单总线结构的运算器,操作速度慢;双总线结构的运算器;三总线结构的运算器,操作速度快

    4. 浮点加减

    • 原理: x = 2 E x ⋅ M x x=2^{E_x} \cdot M_x x=2ExMx y = 2 E y ⋅ M y y=2^{E_y} \cdot M_y y=2EyMy z = x ± y = ( M x 2 E x − E y ± M y ) 2 E y z=x \pm y=( M_x2^{E_x-E_y}\pm M_y)2^{E_y} z=x±y=(Mx2ExEy±My)2Ey
    • 操作数检查:检查x和y是否是0
    • 阶码比较并对阶:检查x和y的小数点是否对齐。在对阶时,使小阶向大阶看齐,即小阶尾数右移
    • 位数加减运算:同定点加减法
    • 结果规格化:当尾数是1.M时向右规格化,即尾数右移一位,阶码加1;当尾数不是1.M时向左规格化
    • 舍入处理:就近舍入(四舍五入);朝0舍入;朝正无穷舍入;朝负无穷舍入
    • 溢出处理:阶码上溢,一般认为是正负无穷;阶码下溢,一般认为是0;尾数上溢,将尾数右移,阶码加1来重新对齐;尾数下溢,舍入处理

    5. 浮点乘除

    • 原理: x = 2 E x ⋅ M x x=2^{E_x} \cdot M_x x=2ExMx y = 2 E y ⋅ M y y=2^{E_y} \cdot M_y y=2EyMy x × y = 2 E x + E y ⋅ ( M x × M y ) x\times y=2^{E_x+E_y}\cdot (M_x\times M_y) x×y=2Ex+Ey(Mx×My) x ÷ y = 2 E x − E y ⋅ ( M x ÷ M y ) x\div y=2^{E_x-E_y}\cdot (M_x\div M_y) x÷y=2ExEy(Mx÷My)
    • 阶码运算:预算时需检查结果是否溢出
    • 尾数处理:同浮点加减法

    6. 浮点运算器

    • 流水线浮点加法器
    展开全文
  • 浮点运算单元(FPU)简介Float Point Unit,浮点运算单元是专用于浮点运算的协处理器,在计算领域,例如三角函数以及时域频域变换通常会用到浮点运算。当CPU执行一个需要浮点数运算的程序时,有三种方式可以执行:软件...

    1).浮点运算单元(FPU)简介

    Float Point Unit,浮点运算单元是专用于浮点运算的协处理器,在计算领域,例如三角函数以及时域频域变换通常会用到浮点运算。当CPU执行一个需要浮点数运算的程序时,有三种方式可以执行:软件仿真器(浮点运算函数库)、附加浮点运算器和集成浮点运算单元。区别于以往的ARM9处理器,目前基于Cortex构架的ARM处理均集成了浮点运算单元。如Nvidia Tegra 2, Tegra 3和 NXP/Freescale i.MX 6集成了VFPv3浮点运算单元,NXP/Freescale i.MX 7 则集成了VFPv4浮点运算单元。ARM 浮点架构(VFP)为半精度、单精度和双精度浮点运算中的浮点操作提供硬件支持。它完全符合 IEEE 754 标准,并提供完全软件库支持,与 NEONTM 多媒体处理功能结合使用时,可增强图像应用程序的性能(如缩放、2D 和 3D 转换、字体生成和数字过滤)。

    2).浮点调用约定(Calling Convention)

    调用约定由应用二进制接口(Application Binary Interface, ABI)来定义参数是如何在调用过程中传递以及如何获取返回值,对于ARM CPU常用的ABI为EABI,提供了两种互相不兼容的方式来传递浮点数:

    调用约定

    描述

    GCC   flag

    EABI soft-float

    Floats are passed in normal (integer) registers.

    -mfloat-abi=soft or -mfloat-abi=softfp

    EABI hard-float

    Floats are passed in floating point registers (VFP).

    -mfloat-abi=hard

    通常交叉编译ToolChain已经配置好所需的ABI而无需在命令行重新设置,并且ToolChain提供的库也已经自动配置为对应的数据格式。

    两个二进制文件(如可执行文件和C库文件)使用不同的调用约定,相互之间是不兼容的。所有的程序和库必须遵循同一个调用约定进行编译,要么软浮点,要么硬浮点。如果你试图在一个基于硬浮点编译的平台上运行一个基于软浮点的程序时,会出现” No such file or directory ” 错误,尽管这这个文件是存在的并且可以执行。

    另外,硬浮点调用约定需要使用浮点运算单元(FPU)的寄存器,因此在不带有浮点运算单元寄存器的处理器上则无法实现。

    下面列出ToradexColibri Tegra ARM 计算机模块 BSP 上所采用的调用约定

    BSP   Version

    Calling   Convention

    BSP V1.x

    EABI soft-float

    BSP V2.x and later

    EABI hard-float

    3).协处理器/硬件引擎

    如本文开篇所述,目前基于Cortex架构的ARM处理器都内置了浮点运算单元(FPU)来加速浮点数据操作,通常浮点运算单元会添加额外的指令到现有的指令集中。于此相关的NEON指令集添加了单指令多数据操作(single instruction act on multiple data ,SIMD),它实现的是NEON 媒体处理器引擎,提供了基于VFPv3指令集的浮点运算单元功能。

    更多介绍请参考:

    - en.wikipedia.org/wiki/ARM_architecture

    - wiki.debian.org/ArmHardFloatPort/VfpComparison

    ./Toradex Colibri产品系列所提供的协处理器/硬件引擎

    Module/CPU   family

    VFP   Unit

    NEON   unit

    Colibri PXA(1)

    -

    -

    Colibri/Apalis iMX6

    VFPv3

    Yes

    Colibri T20

    VFPv3-D16

    -

    Colibri/Apalis T30

    VFPv3

    Yes

    Colibri VFxx

    VFPv3

    Yes

    (1)    注:PXA 系列核心板没有硬件浮点运算单元,但是GCC编译器提供了经过优化的基于IntelInteger SIMD extension(iWMMXt)的软浮点运算仿真功能。

    4).编译器选项

    相关介绍请见如下,下面同样以Toradex产品为例:

    gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/ARM-Options.html#ARM-Options

    ./ Toradex Colibri Tegra系列 BSP编译器选项

    BSP   Version

    GCC   flag

    BSP V1.x

    -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16

    BSP V2.x and later

    -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16

    ./ Toradex Colibri PXA编译器选项

    使用软浮点调用约定编译器,同时编译器选项不能包含FPU相关,产生的代码中不包含由FPU来执行的指令,而是依赖于CPU整数指令集基于相关库进行运算。

    ----------------------------------------------------------------------------------------

    -march=armv5te -mtune=xscale -O3

    ----------------------------------------------------------------------------------------

    ./ Toradex Colibri T20编译器选项

    产生的代码兼容于含NEON协处理器的CPU 。取决于在mfloat-abi 选项所配置的调用约定为”softfp” 还是”hard”

    ----------------------------------------------------------------------------------------

    -march=armv7-a -mfloat-abi=xxx -mfpu=vfpv3-d16 -mtune=cortex-a9 -O3

    ----------------------------------------------------------------------------------------

    ./ Toradex Colibri/Apalisi.MX6/T30编译器选项

    取决于在mfloat-abi选项所配置的调用约定为”softfp” 还是”hard”

    ----------------------------------------------------------------------------------------

    -march=armv7-a -mfloat-abi=xxx -mfpu=neon -mtune=cortex-a9 -O3

    ----------------------------------------------------------------------------------------

    ./ Toradex Colibri VFxx编译器选项

    取决于在mfloat-abi选项所配置的调用约定为”softfp” 还是”hard”,未来可以通过更多的mfpu 选项来优化NEON的实现。

    ----------------------------------------------------------------------------------------

    -march=armv7-a -mfloat-abi=xxx -mfpu=neon -mtune=cortex-a5 -O3

    ----------------------------------------------------------------------------------------

    5).检测一个二进制文件的浮点调用约定

    同样以Toradex产品为例,其所发布的Linux Images 所有的object 目标文件都使用ELF,详细介绍请参考:

    en.wikipedia.org/wiki/Executable_and_Linkable_Format

    首先架构信息(如i686 或者ARM)可以通过” file‘afile’ “程序来获取,架构相关属性信息可以通过” readelf –A ‘afile’ “程序来获取(原生或者交叉编译ToolChain都可以使用readelf)

    如果readelf命令输出信息里面包含"Tag_ABI_VFP_args: VFP registers",则调用约定为硬浮点;如没有,则为软浮点。

    ./以Colibri T20编译的共享目标文件为例

    •使用 VFPv3-D16指令和寄存器

    •不使用 SIMDextensions

    •硬调用约定

    ---------------------------------------------------------------------------------------------------------------------------------------------------

    $ file colibri-t20/usr/lib/libcurl.so.5.3.0

    colibri-t20/usr/lib/libcurl.so.5.3.0: ELF 32-bit LSB shared object,ARM, version 1 (SYSV), dynamically linked, not stripped

    $ readelf -A colibri-t20/usr/lib/libcurl.so.5.3.0

    Attribute Section: aeabi

    File Attributes

    Tag_CPU_name:"7-A"

    Tag_CPU_arch: v7

    Tag_CPU_arch_profile:Application

    Tag_ARM_ISA_use: Yes

    Tag_THUMB_ISA_use: Thumb-2

    Tag_FP_arch: VFPv3-D16

    Tag_ABI_PCS_wchar_t: 4

    Tag_ABI_FP_denormal: Needed

    Tag_ABI_FP_exceptions:Needed

    Tag_ABI_FP_number_model:IEEE 754

    Tag_ABI_align_needed: 8-byte

    Tag_ABI_align_preserved:8-byte, except leaf SP

    Tag_ABI_enum_size: int

    Tag_ABI_HardFP_use: SP andDP

    Tag_ABI_VFP_args: VFPregisters

    Tag_CPU_unaligned_access: v6

    ---------------------------------------------------------------------------------------------------------------------------------------------------

    ./以NXP/FreescaleVybrid编译的共享目标文件为例

    •使用 VFPv3 指令和寄存器

    •使用用 NEONSIMD extensions

    •软调用约定

    ---------------------------------------------------------------------------------------------------------------------------------------------------

    $ file twr-vf65gs10/usr/lib/libcurl.so.5.3.0

    twr-vf65gs10/usr/lib/libcurl.so.5.3.0: ELF 32-bit LSB shared object,ARM, version 1 (SYSV), dynamically linked, not stripped

    $ readelf -A twr-vf65gs10/usr/lib/libcurl.so.5.3.0

    Attribute Section: aeabi

    File Attributes

    Tag_CPU_name:"7-A"

    Tag_CPU_arch: v7

    Tag_CPU_arch_profile:Application

    Tag_ARM_ISA_use: Yes

    Tag_THUMB_ISA_use: Thumb-2

    Tag_FP_arch: VFPv3

    Tag_Advanced_SIMD_arch:NEONv1

    Tag_ABI_PCS_wchar_t: 4

    Tag_ABI_FP_denormal: Needed

    Tag_ABI_FP_exceptions:Needed

    Tag_ABI_FP_number_model:IEEE 754

    Tag_ABI_align_needed: 8-byte

    Tag_ABI_align_preserved:8-byte, except leaf SP

    Tag_ABI_enum_size: int

    Tag_ABI_HardFP_use: SP andDP

    Tag_CPU_unaligned_access: v6

    ---------------------------------------------------------------------------------------------------------------------------------------------------

    ./以Colibri PXA编译的共享目标文件为例

    •不使用浮点运算单元

    •不使用SIMDextensions

    •软调用约定

    ---------------------------------------------------------------------------------------------------------------------------------------------------

    $ file colibri-pxa/usr/lib/libcurl.so.5.3.0

    colibri-pxa/usr/lib/libcurl.so.5.3.0: ELF 32-bit LSB shared object,ARM, version 1 (SYSV), dynamically linked, not stripped

    $ readelf -A colibri-pxa/usr/lib/libcurl.so.5.3.0

    Attribute Section: aeabi

    File Attributes

    Tag_CPU_name:"5TE"

    Tag_CPU_arch: v5TE

    Tag_ARM_ISA_use: Yes

    Tag_THUMB_ISA_use: Thumb-1

    Tag_ABI_PCS_wchar_t: 4

    Tag_ABI_FP_denormal: Needed

    Tag_ABI_FP_exceptions:Needed

    Tag_ABI_FP_number_model:IEEE 754

    Tag_ABI_align8_neededU: Yes

    Tag_ABI_align8_preserved:Yes, except leaf SP

    Tag_ABI_enum_size: int------------------------------------------------------------------------------------------------------------------------------------------------------

    展开全文
  • 浮点运算

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

    浮点运算就是实数运算,因为计算机只能存储整数,所以实数都是约数,这样浮点运算是很慢的而且会有误差。

    大多数机器都是32位的,也就是说32位都用来表示整数的话,那么对于无符号整数就是0 到 2^32-1,对于有符号的话就是-2^31 到 2^31-1。

    中文名

    浮点运算

    外文名

    floating point arithmetic性    质

    实数运算

    原    因

    计算机只能存储整数

    特    点

    实数都是约数

    浮点运算基本特征

    编辑

    语音

    当我们用不同的电脑计算圆周率时,会发现一台电脑的计算较另一台来讲结果更加精确。或者我们在进行枪战游戏的时候,当一粒子弹击中墙壁时,墙上剥落下一块墙皮,同样的场面在一台电脑上的表现可能会非常的呆板、做作;而在另外一台电脑上就会非常生动形象,甚至与我们在现实中看到的所差无几。这都是浮点运算能力的差异导致的。

    如果是实数的话,就不是这样了,机器有两种办法表示实数,一种是定点,就是小数点位置是固定的,一种是浮点,就是小数点位置不固定,计算方法也比较麻烦,通常会比整数运算代价大很多。

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

    BCD->Binary Coded Decimal 压缩的二进制数,是用4个位来表示数字0~9,一个byte表示两个十进制数,比如正常二进制数1001111表示79,而BCD中用 0111 1001 来表示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 32767[1]

    Short Integer 32 bit -2.14e9 to 2.14e9

    Long Integer 64 bit -9.22e18 to 9.22e18

    Single Real 32 bit 1.18e-38 to 3.40e38

    Double Real 64 bit 2.23e-308 to 1.79e308

    extended Real 80 bit 3.37e-4932 to 1.18e4932

    Packed BCD 80 bit -1e18 to 1e18

    双精度数和扩展精度数表示范围对一般应用来说已经足够大了!

    浮点运算整数

    以补码形式存储,正数的补码是其本身,负数补码是其绝对值的各位变反后加1,下面是实际存储的例子:

    0024 var1 dw 24

    FFFE var2 dw -2

    000004D2 var3 dd 1234

    FFFFFF85 var4 dd -123

    0000000000002694var5 dq 9876

    浮点运算BCD数

    在FPU中用80位表示正好是浮点堆寄存器的宽度,在其格式如下存储:

    Bit

    79___72_71________________________________________0

    符号 ---18个二十进制数——————————---

    看下面的例子:

    00000000000000012345 var1 dt 12345

    80000000000000000100 var2 dt -100

    浮点运算浮点数

    这个复杂点,有三种格式

    单精度:_31_30________23_22___________0

    符号 指数 有效数。

    双精度:_63_62__________52_51__________________0

    符号 指数 有效数。

    扩展精度数:

    _79_78____________64_63___________________0

    符号 指数 有效数。

    浮点运算部件

    编辑

    语音

    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 现有精度无法表示,数字太大溢出。

    ZE 除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表示一个对应[2]

    堆栈寄存器的状态,具体含义如下:

    15________________________________________3_____0

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

    |_____|___________________________________|____|

    含义:

    00 = 有效。

    01 = 零。

    10 = 无效或无穷大。

    11 = 为空。

    浮点运算格式

    编辑

    语音

    单精度:_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中来定义[3]

    双精度浮点数,8 bytes

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

    浮点运算指令系统分类

    编辑

    语音

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

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

    1、数据传送类

    这类指令主要是从内存装入浮点寄存器堆数据,一般目的地址总是栈顶ST(0),用调试器你可以清楚地看到这一点.注意带P结尾的操作,是在前面操作完成之后[4]

    出栈,也就是原来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

    如果指令后面未带[5]

    操作数,其默认的操作数为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

    浮点运算例子

    编辑

    语音

    计算机里整数和小数形式就是按普通格式进行存储,例如1024、3.1415926等等,这个没什么特点,但是这样的数精度不高,表达也不够全面,为了能够有一种数的通用表示法,就发明了浮点数。

    浮点数的表示形式有点像科学计数法(*.*****×10^***),它的表示形式是0.*****×10^***,在计算机中的形式为 .***** e ±***),其中前面的星号代表定点小数,也就是整数部分为0的纯小数,后面的指数部分是定点整数。利用这样的形式就能表示出任意一个整数和小数,例如1024就能表示成0.1024×10^4,也就是 .1024e+004,3.1415926就能表示成0.31415926×10^1,也就是 .31415926e+001,这就是浮点数。浮点数进行的运算就是浮点运算。

    浮点运算比常规运算更复杂,因此计算机进行浮点运算速度要比进行常规运算慢得多。

    浮点运算其他

    编辑

    语音

    5e8f656001bad496c198d082a325351f.png另外,[6]

    浮点运算的常见形式是开方运算。目前所有的计算机使用的都是浮点运算,普通人的电脑也用的是浮点运算。

    词条图册

    更多图册

    参考资料

    1.

    邱富杭,曾健民编著. C语言程序设计学习指导 第2版[M]. 北京:中国铁道出版社, 2013:3

    3.

    DCS系统不兼容双精度浮点数问题研究与处理

    .中国知网[引用日期2017-04-03]

    4.

    出栈序列的性质及其求解新算法

    .知网[引用日期2017-04-03]

    5.

    浮点乘加部件中三操作数前导1预测算法的设计

    .知网[引用日期2017-04-03]

    展开全文
  • 定点DSP如何做浮点运算

    千次阅读 2021-01-17 16:24:42
    许多DSP芯片只支持整数运算,如果现在这些芯片上进行小数运算的话,定点...下面先介绍定点小数的一些理论知识,然后以C语言为例,介绍一下定点小数运算方法。在TIC5000DSP系列中使用16比特为最小的储存单位,所以...
  • 原标题:比拼浮点运算速度,超算排行榜是这样“算”出来的科技日报记者 过国忠 通讯员 梅国英 吴婷6月17日,新一期全球超算500强榜单出炉,入选500强的所有超算浮点运算速度都突破每秒千万亿次,中国超算也在前四...
  • 的相加减问题是,出现了浮点运算不准的情况,看来都说解释型语言对于浮点运算都会有问题的说法是真的。首先看一段代码:$a = 0.1;$b = 0.7;var_dump(($a + $b) == 0.8);打印出来的值居然为 boolean false这是为啥?PHP...
  • 目前大多数CPU都支持浮点运算单元FPU,FPU作为一个单独的协处理器放置在处理器核外,但是对于嵌入式处理器,浮点运算本来就少用,有些嵌入式处理器就会去掉浮点协处理器。X86处理器一般都是有FPU的。而ARM PPC MIPS...
  • 具体来说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。大部分计算机采用二进制(b=2)的表示方法。位(bit)是衡量浮点数所需存储空间...
  • 原标题:比拼浮点运算速度 超算排行榜是这样“算”出来的 6月17日,新一期全球超算500强榜单出炉,入选500强的所有超算浮点运算速度都突破每秒千万亿次,中国超算也在前四占有两席位置。普通计算机用指令运算速度...
  • 在支持硬件浮点处理的器件上,对浮点运算的编程最快捷的方法就是直接使用浮点类型,比如单精度的float来完成。但是在很多情况下,限于成本、物料等因素,可供我们使用的只有一个定点处理器时,直接使用float类型进行...
  • 但是实际测试发现niosii需要通过添加定制指令或者IP核的方法才能对浮点运算加速。 在高版本的QSYS中,提供了FPH2和FPH1两种浮点运算IP核。手册中提到采用FPH2后,在50Mhz的时钟周期下,一次浮点乘法只需240ns。 ...
  • 首先,可以知道运算的真值为: trueval=0.000023371258+33.678429+(-33.677811)=0.000641371258=6.41371258*10^(-4) F(10,8,L,U)这种表达法我还没见过,但我的理解是:十进制,八位浮点运算,无符号Long型,不知道正确不?...
  • 6月17日,新一期全球超算500强榜单出炉,入选500强的所有超算浮点运算速度都突破每秒千万亿次,中国超算也在前四占有两席位置。普通计算机用指令运算速度衡量计算性能,而超算通常用浮点运算速度来衡量其性能。那么...
  • 浮点数的运算步骤

    千次阅读 2021-02-19 23:32:12
    浮点数的运算步骤 浮点数的加减运算一般由以下五个步骤完成:对阶...对阶的具体方法是:首先求出两浮点数阶码的差,即⊿E=E x-E y,将小阶码加上⊿E,使之与大阶码相等,同时将小阶码对应的浮点数的尾数右移相应位数
  • 常常听网友吐槽VBA这个老态龙钟的古董级别的编程语言太难用,出道多年这个是不争的事实,但是是否好用就...言归正传,今天来看看经常被吐槽的VBA浮点运算问题,VBA不是专门的科学计算语言,所以会产生浮点计算误差。
  • 在支持硬件浮点处理的器件上,对浮点运算的编程最快捷的方法就是直接使用浮点类型,比如单精度的float来完成。但是在很多情况下,限于成本、物料等因素,可供我们使用的只有一个定点处理器时,直接使用float类型进行...
  • 浮点的加减运算 对阶 尾数相加 对阶的时候:从小阶向大阶靠齐,这样阶数增加,尾数右移 e.g 注:这里求阶差的时候,用的是 [-jy]补。最后算出来的阶差是11,10,符号位是1,尾数是10,所以是-2。 最后阶补2,...
  • 我需要在Java中做一些浮点运算,如下面的代码所示:public class TestMain {private static Map ccc = new HashMap() {{ put(1, 0.01); put(2, 0.02); put(3, 0.05); put(4, 0.1); put(6, 0.2);put(10, 0.5); put(20...
  • 设阶码3位,尾数6位,按浮点运算方法,完成下列取值的x+y,x-y运算:x = 2-101*(-0.), y = 2-100*0.解:x浮= 11011,-0.y浮= 11100,0.Ex-Ey = 11011+00100 = 11111规格化处理: 0. 阶码 11010规格化处。 7、理: 1. 阶...
  • float oint unit浮点运算单元 STM32系列M3不支持,M4支持单精度,M7支持双精度 如图独立于CPU内核,可单独开启关闭 设置方法 图片.png 方法一.jpg 方法二.jpg DSP STM32F4采用Cortex-M4内核,相比...
  • 计算机组成原理第4章 浮点数运算方法课件第4章 浮点运算规则;浮点数的表示;浮点加减运算;浮点加减运算的步骤;1. 对阶;例:两浮点数 x = 0.1101×201, y = -(0.1010)×211,求x+y。(1)首先写出x、y在计算机中的补码...
  • 第 6 章 浮点运算

    2021-05-07 01:16:55
    第 6 章 浮点运算本章分析浮点运算并提出避免和检测数值计算错误的策略。有关 SPARC 和 x86 处理器浮点计算的详细说明,参见《数值计算指南》。6.1 简介SPARC 处理器上的 Fortran 95 浮点环境实现了“二进制浮点运算...
  • 如下C#代码:float a = 0.65f;float b = 0.6f;...下面我们来分析下:我们知道将一个十进制数值转换为二进制数值,需要通过下面的计算方法:1. 整数部分:连续用该整数除以2,取余数,然后商再除以2,...
  • 浮点运算改定点运算

    2021-05-26 02:41:48
    第3章 DSP芯片的定点运算3.1 数 的 定 标在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,235
精华内容 46,094
关键字:

浮点运算方法