• 5.浮点数及其运算


    目录

    一. 浮点数的表示

    (1)表示

    (2)规格化

    二. IEEE 754标准

    三. 浮点数的运算

    (1)步骤

    (2)关于舍入

    四. C语言的强制类型转换


    一. 浮点数的表示

    (1)表示

    定点数可表示的数字范围有限,但我们不能无限制地增加数据的长度。

    浮点数:由阶码和尾数构成:

    阶码E反映浮点数的表示范围及小数点的实际位置;尾数M的数值部分的位数n反映浮点数的精度。

    阶码:常用补码或移码表示的定点整数。尾数:常用原码或补码表示的定点小数。
    例:阶码、尾数均用补码表示,求a、b的真值。a=0,01;1.1001  b=0,10;0.01001
    解:a:阶码0,01对应真值+1,尾数1.1001对应真值-0.0111=-(2^{-2}+2^{-3}+2^{-4})

    所以a的真值2^{-1}*-0.0111=-0.111,其中2^{-1}相当于尾数表示的定点小数算数左移一位,或小数点右移一位。

    同理b的真值是2^{2}*+0.01001=+1.001.

    (2)规格化

    规格化浮点数:规定尾数的最高数值位必须是一个有效值。不能是0.

    • 左规:当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减1。(通过算数左移,阶码减1来规格化)

    • 右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,将尾数算数右移一位,阶码加1。(通过算数右移阶码加1来规格化)

    规格化浮点数的特点:

    1.用原码表示的尾数进行规格化:规格化的原码尾数,最高数值位一定是1
    正数为0.1××...×的形式,其最大值表示为0.11...1;最小值表示为0.10...0。尾数的表示范围为1/2\leq M\leq(1-2^{-n})
    负数为1.1××...×的形式,其最大值表示为1.10...0;最小值表示为1.11..1。尾数的表示范围为-(1-2^{-n})\leqslant M\leqslant-1/2
    2.用补码表示的尾数进行规格化:规格化的补码尾数,符号位与最高数值位一定相反(人为规定)
    正数为0.1××...×的形式,其最大值表示为0.11...1;最小值表示为0.10...0。尾数的表示范围为1/2\leq M\leq(1-2^{-n})
    负数为1.0××...×的形式,其最大值表示为1.01...1;最小值表示为1.00...0。尾数的表示范围为-1\leqslant M\leqslant-(1/2+2^{-n})

    二. IEEE 754标准

    我们首先回顾下移码的定义:移码=真值+偏置值
    此处8位移码的偏置值=128D=1000 0000B,即2^{n-1}.
    例如真值-127=-1111111B,移码=-1111111+ 10000000= 0000 0001
    例如真值-3=-11B,移码=-11+ 10000000= 0111 1101。

    现在我们把偏置值减去1,也就是127D=0111 1111B,即2^{n-1}-1.

    在IEEE 754标准中,阶码用移码表示,尾数用原码表示。

    规格化的短浮点数的真值为:(-1)^s\times 1.M\times2^{E-127}。隐藏表示天然的就保证了规格化。阶码真值=移码-偏移量。

    例1:将十进制数-0.75转换为IEEE 754的单精度浮点数格式表示。

    解:(-0.75)_{10}=(-0.11)_{2}=(-1.1)_2\times 2^{-1},进行了右规。
    数符=1,尾数部分= .1000000.....(隐含最高位1)

    阶码真值=-1,单精度浮点型偏移量=127D,移码=阶码真值+偏移量=-1+1111111=0111 1110(凑足8位,当然也可以先10进制计算-1+127=126,126转换成二进制就是0111 1110)
    所以转换结果是1 01111110 10000000000000000000000

    例2:IEEE 754的单精度浮点数C0 A0 00 00H的值时多少。

    解:C0 A0 00 00H→1100 0000 1010 0000 0000 0000 0000 0000

    数符=1→是个负数
    尾数部分=.0100....(隐含最高位1)→尾数真值=(1.01)_2

    移码=10000001,若看作无符号数=129D,单精度浮点型偏移量=127D
    阶码真值=移码-偏移量=1000 0001-111 1111= (0000 0010)_2=(2)_{10}

    浮点数真值=(-1.01)_2\times 2^2=-5.0.

    IEEE 754单精度浮点型能表示的最小绝对值、最大绝对值是:
    最小绝对值:尾数全为0,阶码真值最小-126,对应移码机器数0000 0001此时整体的真值为(1.0)_2\times 2^{-126}
    最大绝对值:尾数全为1,阶码真值最大127,对应移码机器数11111110此时整体的真值为(1.11...11)_2\times 2^{127}

    最后介绍几种特殊情况,也就是阶码全1或者全0的情况:

    • 当阶码E全为0,尾数M不全为0时,表示非规格化小数±(0.xx….x)×2^{-126},此时尾数隐藏的最高位是0,阶码真值固定为-126;
    • 当阶码E全为0,尾数M全为0时,表示真值±0;
    • 当阶码E全为1,尾数M全为0时,表示无穷大;
    • 当阶码E全为1,尾数M不全为0时,表示非数值“NaN"(Not a Number);

    三. 浮点数的运算

    (1)步骤

    下面举一个浮点数计算的例子:

    例:已知十进制数X=-5/256、Y=+59/1024,按机器补码浮点运算规则计算X-Y,结果用二进制表示,浮点数格式如下∶阶符取2位,阶码取3位,数符取2位,尾数取9位。

    注意这里全部采用补码运算:

    (2)关于舍入

    “0”舍“1”入法:类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。

    恒置“1”法:尾数右移时,不论丢掉的最高数值位是“1”还是“0”,都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。

    四. C语言的强制类型转换

    char→int →long→double,或float→double,范围、精度从小到大,转换过程没有损失。
    而int→float可能损失精度,float→int可能溢出及损失精度。
    int:表示整数,范围-2^{31}2^{31}-1,有效数字32位;
    float:表示整数及小数,范围\pm [2^{-126},2^{127}\times(2-2^{-23})],有效数字23+1=24位。

  • 相关阅读:
    1、【开始】【简介】Qlib:量化平台
    MongoDB数据库
    Java使用Redis的几种客户端介绍
    Flask 学习-31.flask_jwt_extended 验证token四种方headers/cookies/json/query_string
    java后端社招面试经历
    零基础学Java第六节(面向对象二)
    JavaScript:来一波Promise用法实例,可能是面试题吧
    【微信小程序毕业设计源代码】校园考勤打卡及作业管理小程序系统丨前后分离VUE[包运行成功]
    与创新者同行!Apache Doris 首届线下峰会即将开启,最新议程公开!|即刻预约
    c++中指针概念及指针变量的大小
  • 原文地址:https://blog.csdn.net/qq_54708219/article/details/134337191