• 转载C语言:浮点数在内存中的表示


    单精度浮点数: 1位符号位   8位阶码位   23位尾数

    双精度浮点数: 1位符号位   8位阶码位   52位尾数

     

    实数在内存中以规范化的浮点数存放,包括数符、阶码、尾数。数的精度取决于尾数的位数。比如32位机上float型为23位       double型为52位。

    单精度float型存储在内存中的大小为4个字节,即32位。

    浮点表示的一般形式为:R=M*2^e (R:Real       M:Mantissa尾数     e:exponent阶码)

    把上面float的二进制可分成三部分:

       x                   xxxxxxxx             xxxxxxxxxxxxxxxxxxxxxxx

    数符(1b)         阶码(8b)         尾数(23b)

    double型的浮点数分别是:数符(1b)、阶码(8b)、尾数(52b)

    数符sign:real的正负号     "+":0        "-":1

    阶码e:e=E-127(double型中e=E-1023) e为正值说明这个浮点数向左移动了e位, e为负值说明这个浮点数向右移动了e位。127=2^7-1 1023=2^10-1

    尾数M:有效数字位,这里是有效数字位的部分二进制码

    例1:float型浮点数125.5转化成32位二进制浮点数

    125.5的二进制码为1111101.1,写成二进制的科学计数为:1.1111011*2^6(因为科学计数法“整数”部分大于1,在二进制中,“整数”部分只能恒为1)即向左移6位,则e=6,则E=e+127=133,而E的二进制码为10000101,而1.1111011把“整数”部分去除1之后为1111011,之后补0,共23b,形成了阶码。

    所以125.5的32位二进制浮点数为

    0 10000101 11110110000000000000000

    例2:float型浮点数0.5转化成32位二进制浮点数

    0.5的二进制码为0.1,写成二进制的科学计数为:1.0*2^(-1)即向右移1位,则e=-1,则E=e+127=126,而E的二进制码为01111110,而1.0把“整数”部分去除1之后为0,之后补0,形成了阶码。

     

    所以0.5的32位二进制浮点数为

    0 01111110 00000000000000000000000

    double型浮点数类似。

    例3:32位二进制浮点数为0 10000010 00010000000000000000000转化成十进制数浮点数

    题中已给我们分了三部分,数符部分、阶码部分、尾数部分。

    数符部分为0,则代表此数为正数;阶码部分为10000010,则E=130,则e=E-127=3,则说明其向左移了3位,0001加上“整数”部分的1之后,为1.0001。则原二进制数为1000.1=十进制8.5,或R=1.0001*2^3=8.5

    其中很多计算类似。可举一反三!

  • 相关阅读:
    Linq与Lambda,神一般的工作效率
    svn和git孰优孰劣
    关于C++的***5的输出问题
    POJ 3469 Dual Core CPU(最小割)
    HDU 4259 Double Dealing
    最大流Dinic算法
    HDU 4442 Physical Examination(2012年金华赛区现场赛A题)
    int ,long , long long类型的范围
    POJ 1679 The Unique MST(判断最小生成树是否唯一)
    HDU 4280 Island Transport(网络流)
  • 原文地址:https://www.cnblogs.com/ivorfeng/p/2999220.html
Copyright © 2020-2023  润新知