精华内容
下载资源
问答
  • 首先,float单精度浮点型,计算机会分配4字节,32位来进行存储,而double float双精度浮点型,计算机则会分配8个字节,即64位来进行小数的存储,这是后面进行详细解释的必备知识。 其次,计算机在存储浮点型数据时,...

    1问题的提出

    最近在学习过程中,遇到了题目中出现的陈述,但是对于原因没有头绪,同时在互联网上很难找的到合理的我想要的解释,因此我搜罗了一些前人的知识,结合自己的理解,总结一下。

    2问题的解释

    首先,float单精度浮点型,计算机会分配4字节,32位来进行存储,而double float双精度浮点型,计算机则会分配8个字节,即64位来进行小数的存储,这是后面进行详细解释的必备知识。
    其次,计算机在存储浮点型数据时,会将浮点型数据分为3个部分来进行存储(至于为什么,规定),分别为:
    (1)符号位(这个熟悉整型的二进制存储应该知道的,首尾二进制0表示正数,1表示负数,不多说,占一个字节);
    (2)指数部分(计算机使用浮点型存储时,会将源数据转换为科学计数法来存储,例如,8.25,转化为二进制为1000.01,然后转化为科学计数法,注意是2进制,将底数10换为2为,1.00001 × 2的3次方,指数为3,这个指数部分的数据就是存储着源10进制数据转换为2进制时科学计数法表示的指数相关,这里说的是相关,并不是存储着3,多说一句,这个指数部分的首位二进制表示着指数的正负,换句话说,1表示源十进制数的绝对值大于等于1,0表示小于1,更多了解,自行见文尾参考链接
    (3)尾部存储的是二进制科学计数法的所精确的小数数值(二进制存储),例如1.00001 × 2的3次方的00001,超出存储位数‘四舍五入’,不足位数补向左补0.
    具体float和double float见下图:
    float类型:
    在这里插入图片描述
    double float类型
    在这里插入图片描述
    至于其中的指数部分为什么是8和11,没法解释,这么设计的。
    即,符号位都是表示源十进制数据的正负,指数部分的首位都是0或1表示二进制科学计数法的指数正负,其余位数存储着和指数相关的值,最后尾数部分存储着二进制科学计数法的小数部分数值。
    因此,尾数部分决定着精确的实际能够存储的十进制数据位数精度:
    (1)单精度:23位能存储的数据量为2的(23+1)次幂为16777216,结果取10常用对数发现,在7和8之间,因此,精度最大不要超过7位小数,常常称为不要超过6位
    (2)双精度:相应地,对于双精度的64位存储,去掉首尾符号位1字节和指数部分的11字节,尾数的52字节能存储最大数据量为2的(52+1)次幂为9007199254740992,同样发现,最大的十进制小数位位数16~17之间,因此最好不要超过15位

    最后

    不知道大家有没有理解,下面是我发现写的非常好的文章,有更深度需求的同学可以参考。
    参考链接:https://www.cnblogs.com/Reverse-xiaoyu/p/11618913.html

    展开全文
  • 单精度与双精度浮点型

    千次阅读 2014-09-16 20:41:53
    这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2—— 即把一个浮点数表示为尾数乘以2 的指数次方再添上符号。下面是具体的规格:  符号位 阶码 尾数 长度  float 1 8 23
      目前C/C++ 编译器标准都遵照IEEE 制定的浮点数表示法来进行float,double 运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2,即把一个浮点数表示为尾数乘以2 的指数次方再添上符号。下面是具体的规格:
                 
    符号位     阶码      尾数     长度 
    float           1          8        23      32

    double          1         11        52      64

    以下通过几个例子讲解浮点数如何转换为二进制数

    例一:

    已知:double 类型38414.4 。

    求:其对应的二进制表示。

    分析:double 类型共计64 位,折合8 字节。由最高到最低位分别是第63 、62 、61 、…… 、0 位:
        
     最高位63 位是符号位,1 表示该数为负,0 表示该数为正;
        62-52
     位,一共11 位是指数位;
        51-0
     位,一共52 位是尾数位。

         
    步骤:按照IEEE 浮点数表示法,下面先把38414.4 转换为十六进制数。
         
     把整数部和小数部分开处理: 整数部直接化十六进制:960E 。小数的处理:
    0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
         
    实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53 位就行了。隐藏位技术:最高位的1 不写入内存(最终保留下来的还是52 位)。
        
     如果你够耐心,手工算到53 位那么因该是:38414.4(10)=1001011000001110.0110101010101010101010101010101010101(2)

    科学记数法为:1.0010110000011100110101010101010101010101010101010101 ,右移了15 位,所以指数为15 。或者可以如下理解:

    1.00101100000111001101010101010101010101010101010101012 ×215
         
    于是来看阶码,按IEEE 标准一共11 位,可以表示范围是-1024 ~ 1023 。因为指数可以为负,为了便于计算,规定都先加上1023(2^10-1) ,在这里,阶码:15+1023=1038 。二进制表示为:100 00001110 ;
        
     符号位:因为38414.4 为正对应  为0 ;
        
     合在一起(注:尾数二进制最高位的1 不要 ):
    0100 0000 1110 0010 1100 0001 1100 1101 0101 0101 0101 0101 0101 0101 0101 0101

    例二:

    已知:整数3490593(16 进制表示为0x354321 ) 。

    求:其对应的浮点数3490593.0 的二进制表示。  

    解法如下:

    先求出整数3490593 的二进制表示:

     H:    3     5    4    3    2     1   (十六进制表示)

     B:   001 1  0101 0100 0011 0010  0001 (二进制表示)

             │←──────21 ─────→│

     

    即: 

                   1.1010101000011001000012 × 221

    可见,从左算起第一个1 后 21 位,我们将这21 为作为浮点数的小数表示,单精度浮点数float 由符号位1 位,指数域位k =8 位,小数域位( 尾数 )n=23 位构成,因此对上面得到的21 位小数位我们还需要补上2 个0 ,得到浮点数的小数域表示为:

             1 0101 0100 0011 0010 0001 00

     

    float 类型的 偏置量 Bias=2k-1 -1=28-1 -1=127 ,但还要补上刚才因为右移作为小数部分的 21 位,因此偏置量为 127+12=148 ,就是 IEEE 浮点数表示标准:

                              V = (-1)s × M × 2E

                        E = e-Bias

    中的 e ,此前计算 Bias=127 ,刚好验证了 E=148-127=21 

     

     148 转为二进制表示为 10010100 ,加上符号位 0 ,最后得到二进制浮点数表示 1001010010101010000110010000100 ,其 16 进制表示为:

     H:     4        A       5          5         0         C         8        4  

     B:  0 100   1010   0 101    0101   0000   1100  1000   0100

                        |←────      21        ─────→   |

         1|←─8   ─→||←─────       23       ─────→ |

     

    这就是浮点数 3490593.0(0x4A550C84) 的二进制表示。

    例三:

    0.5 的二进制形式是0.1

    它用浮点数的形式写出来是如下格式

     

    0                01111110                 00000000000000000000000


    符号位           阶码                       小数位

    正数符号位为0 ,负数符号位为1

    阶码是以2 为底的指数

    小数位表示小数点后面的数字


    下面我们来分析一下0.5 是如何写成0 01111110 0000000 00000000 00000000


    首先0.5 是正数所以符号位为0

    再来看阶码部分,0.5 的二进制数是0.1, 而0.1 要表示为1.0*2^(-1) ,科学表示时整数部分不能为0 所以我们总结出来:

    要把二进制数变成(1.f)*2^(exponent) 的形式, 其中exponent 是指数

    而由于阶码有正负之分所以阶码=127+exponent;

    即阶码=127+(-1)=126  01111110

    余下的小数位为二进制小数点后面的数字, 即00000000000000000000000


    由以上分析得0.5 的浮点数存储形式为0 01111110 00000000000000000000000  

    注:如果只有小数部分, 那么需要右移小数点比如右移3 位才能放到第一个1 的后面阶码就是127-3=124.

    例四   20.59375 )10 = (10100.10011 2

    首先分别将整数和分数部分转换成二进制数: 

    20.59375
     =10100.10011 

    然后移动小数点,使其在第1 ,2 位之间 

    10100.10011
     =1.010010011×2^4   e =

    于是得到: 

    S
     =0 , E =4 +127 =131 , M =010010011 

    最后得到32 位浮点数的二进制存储格式为: 

    0100 0001 1010 0100 1100 0000 0000 0000 
    (41A4C000)16


    例五:
    -12.5 转为单精度二进制表示
    12.5: 
    1. 
    整数部分12 ,二进制为1100; 小数部分0.5, 二进制是.1 ,先把他们连起来,从第一个1 数起取24 位(后面补0 ): 
    1100.1 000 00000000 00000000 
    这部分是有效数字。(把小数点前后两部分连起来再取掉头前的1 ,就是尾数) 
    2. 
    把小数点移到第一个1 的后面,需要左移3 位(1.1001 000 00000000 00000000*2^3 加上偏移量127 :127+3=130 ,二进制是10000010 ,这是阶码。 
    3. -12.5
     是负数,所以符号位是1 。把符号位,阶码和尾数连起来。注意,尾数的第一位总是1 ,所以规定不存这一位的1 ,只取后23 位: 
    1 10000010 10010000000000000000000 
    把这32 位按8 位一节整理一下,得: 
    11000001 01001000 00000000 00000000 
    就是十六进制的 C1480000

    例六:

    2.025675 
    1. 
    整数部分2 ,二进制为10; 小数部分0.025675, 二进制是.0000 01101001 00101010 01 ,先把他们连起来,从第一个1 数起取24 位(后面补0): 
    10.0000011010010010101001 
    这部分是有效数字。把小数点前后两部分连起来再取掉头前的1 ,就是尾数: 00000011010010010101001 
    2. 
    把小数点移到第一个1 的后面,左移了1 位加上偏移量127 :127+1=128 ,二进制是10000000 ,这是阶码。 
    3. 2.025675
     是正数,所以符号位是0 。把符号位,阶码和尾数连起来: 
    0 10000000 00000011010010010101001 
    把这32 位按8 位一节整理一下,得: 
    01000000 00000001 10100100 10101001 
    就是十六进制的 4001A4A9.  

    例七: 
    (
     逆向求十进制整数) 一个浮点二进制数手工转换成十进制数的例子: 
    假设浮点二进制数是 1011 1101 0100 0000 0000 0000 0000 0000 
    1 ,8 ,23 位分成三段: 
    01111010 10000000000000000000000 
    最后一段是尾数。前面加上"1.", 就是 1.10000000000000000000000 
    下面确定小数点位置。由
     E = e-Bias  阶码E 是01111010 ,加上00000101 才是01111111 (127 ), 
    所以他减去127 的偏移量得e=-5 。(或者化成十进制得122 ,122-127=-5 )。 
    因此尾数1.10 (后面的0 不写了)是小数点右移5 位的结果。要复原它就要左移5 位小数点,得0.0000110, 即十进制的0.046875 
    最后是符号:1 代表负数,所以最后的结果是 -0.046875 

    注意: 其他机器的浮点数表示方法可能与此不同不能任意移植 。

     

    再看一例( 类似例七) :

    比如:53004d3e

    二进制表示为:

    01010011000000000100110100111110

    按照1 个符号    8 个指数          23 个小数位划分

    0              10100110         00000000100110100111110

    正确的结果转出来应该是551051722752.0

    该怎么算?

    好,我们根据IEEE 的浮点数表示规则划分,得到这个浮点数的小数位是:

      000 000001001101 00111110 

    那么它的二进制表示就应该是:

    1.000000001001101001111102 × 239 
    标准化公式中的M 要求在规格化的情况下,取值范围 1<M<(2- ε)

    正因为如此,我们才需要对原始的整数二进制表示做偏移,偏移多少呢?偏移 2E  
    这个“E” 怎么算?上面的 239 怎么得来的呢? 浮点数表示中的8 位指数为就是告诉这个的。我们知道: 
    E = e-Bias 
    那么根据指数位:

    101001102 => 16610 
    e=166 ,由此算出E=e-Bias=166-127=39 ,就是说将整数二进制表示转为标准的浮点数二进制表示的时候需要将小数点左移39 位,好,我们现在把它还原得到整数的二进制表示:

    1 00000000100110100111110 0000000000000000

    1 │←───── 23 ─────→│←─── 16 ───→│

    23+16=39
     ,后面接着就是小数点了。
    拿出计算器,输入二进制数1000000001001101001111100000000000000000
    转为十进制数,不正是:551051722752 么!



    展开全文
  • 关于16进制浮点数对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数),1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示;2、第30~23 bit为幂数,其读...

    文章来源:http://blog.csdn.NET/educast/article/details/8522818

    感谢原作者。

     

    关于16进制浮点数
    对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数), 
    1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示; 
    2、第30~23 bit为幂数,其读数值用e表示; 
    3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x;

    则按照规定,该浮点数的值用十进制表示为: 
    = (-1)^s * (1 + x) * 2^(e - 127)

    对于49E48E68来说, 
    1、其第31 bit为0,即s = 0 
    2、第30~23 bit依次为100 1001 1,读成十进制就是147,即e = 147。 
    3、第22~0 bit依次为110 0100 1000 1110 0110 1000,也就是二进制的纯小数0.110 0100 1000 1110 0110 1000,其十进制形式为0.78559589385986328125,即x = 0.78559589385986328125。

    这样,该浮点数的十进制表示 
    = (-1)^s * (1 + x) * 2^(e - 127) 
    = (-1)^0 * (1+ 0.78559589385986328125) * 2^(147-127) 
    = 1872333

    以上内容为IEEE的标准,现在有个问题,假设我有两台设备在通讯,一个设备向另外一个设备发送数据,这个数据是浮点数,那么我怎么来发送这个数据呢?怎么让接受方知道发送来的是个浮点数呢?而且发送数据要尽量短,最好还要固定长度,也许有人会怎么做:A发送数据3.7586给B,A先将这个浮点数乘以10000变成整型37586,然后将这个整数发送给B,这样使用的弊端是:1、B要事先知道A将这个数字放大了多少倍。2、A需要做一次浮点数的乘法运算,而B要做一次浮点数的除法运算,这对于单片机来说是个负担。3、这样使用会多占用发送数据。因为事先没人知道这个浮点数到底多大。

    想了半天,觉得使用IEEE的浮点数规则来发送是最可靠的,因为任何浮点数都被表示成4个字节,这对发送和接收双方都是个好消息,只要双方都知道要进行浮点数的发送就可以了。而且IEEE格式浮点数的转换是机器内部执行的,我们不再需要任何的转换,不增加运算量,不增加代码量。
    按照这个原则,编写了测试代码如下:
    发送方A:
    float fSend; //A需要发送的浮点数据
    char chSend[4]; //发送缓冲,经过转换后的浮点数据,变成一个字符型数组。
    //以下为转换
    chSend[0] = *((char *)(&fSend));
    chSend[1] = *((char *)(&fSend) + 1);
    chSend[2] = *((char *)(&fSend) + 2);
    chSend[3] = *((char *)(&fSend) + 3);

    此时A就可以将这个数字发送给B了,B接收到的是4个字节表示的一个浮点数,但需要经过如下转换使用:

    float fReceive; //接收到的浮点数
    char chReceive[4];//接收缓冲。B将接收到的4个字节保存在这里。
    //以下为转换
    *((char *)(&fReceive)) = chReceive[0];
    *((char *)(&fReceive) + 1) = chReceive[1];
    *((char *)(&fReceive) + 2) = chReceive[2];
    *((char *)(&fReceive) + 3) = chReceive[3];

    好了,此时的B已经得到了一个浮点数fReceive;

    转载于:https://www.cnblogs.com/zhangbing12304/p/7027965.html

    展开全文
  • 浮点型数据类型

    2021-01-16 16:44:40
    double:双精度浮点型 decimal:数字型 单精度和双精度 精度是指计算机表达小数近似值的一种方式; 单精度32位二进制,4个字节; 双精度64位二进制,8个字节。 类型 精度(位数) float 7 double 15 ...

    浮点型数据类型

    浮点型数据类型主要分为三种:
    float:单精度浮点型
    double:双精度浮点型
    decimal:数字型
    单精度和双精度
    精度是指计算机表达小数近似值的一种方式;
    单精度32位二进制,4个字节;
    双精度64位二进制,8个字节。

    类型 精度(位数)
    float 7
    double 15
    decimal 28

    float:单精度浮点型,占字节数为4,用32位二进制描述,有符号是7个有效位,无符号是8个有效位。

    double:双精度浮点型,占字节数为8,用64位二进制描述,有符号是15个有效位,无符号是16个有效位。

    decimal:数字型,用128位二进制描述,不存在精度损失,常用于银行帐目计算。(28个有效位)

    展开全文
  • 在MATLAB中有15种基本的数据类型:8种整型数据类型、单精度浮点型(float)、双精度浮点型(double)、逻辑型(logical)、字符串型(char)、单元数组型(cell)、结构体类型(struct)和函数句柄型(function_handle)。...
  • 浮点型:float(浮点型)、double(双精度浮点型);字符型:char(字符型);布尔型:boolean(布尔型)。二、整型中 byte、short、int、long 取值范围byte:一个字节有8位,去掉符号位还有7位,正数为避免进位还要减1,...
  • 浮点型数据分为单精度浮点型(float)和双精度浮点型(double). 单精度(float) 单精度浮点值 取值范围:1.2E-38 到 3.4E+38 精度:6 位小数 单精度浮点值。单精度是这样的格式,1位符号,8位指数,23位小数。 上述图片是...
  • c#入门-浮点型

    2020-12-24 07:33:51
    double,双精度浮点型,8字节 decimal,高精度浮点型,16字节 他们没有无符号变种 常用类型是double double是8字节的数据,那么他能储存的上限是多少呢 和long一样是263-1? 他的上限是1后面跟308个0 为什么会这么...
  • 数据类型之浮点型

    2016-10-20 18:38:27
    浮点型浮点型是数据类型的一种浮点型的分类 单精度浮点型 4个字节 -2^128 ~ +2^128 ...双精度浮点型 8个字节 -2^1024 ~ +2^1024 -1.79E+308 ~ +1.79E+308 存储 1bit(符号位) 11bits(指数位) 52bits(尾
  • 浮点型变量和字符型变量

    千次阅读 2019-04-18 21:46:04
    今天来说说起浮点型变量和字符型变量 顾名思义,浮点类型变量是用来存储带有小数的实数...浮点型都是有符号的。 单精度浮点数: 通常占用4个字节(32位)存储空间,其数值范围为-3.4E38~3.4E38,单精度浮点数最...
  • 基本数据类型类型名称说明char 字符类型存放字符的ASCII码int 整型存放有符号整数short 短整型存放有符号整数long 长整型存放有符号整数long long 存放有符号整数float 单精度浮点型存放精度不高的小数double 双精度...
  • 基本类型:   整型: ...浮点型:单精度型:float 双精度型:double 长双精度型:long double   布尔型 bool       派生类型: 指针类型(*) 枚举类型(enum) 数组类型([]
  • Float 浮点型

    2018-02-25 21:52:52
    3. php浮点型在计算机中采用IEEE754双精度格式表示:十进制7 转化为二进制 0111 规格化科学计数法 1.11 ×2^2在32位系统中:1位表示符号位(0) 8位表示阶码(00000010)23位表示尾数(1.11)在64位系统中:1位表示符号...
  • (c语言)单、双精度

    2020-03-25 21:20:28
    单精度型 1.用符号float表示 2. 分配4个字符 3.数值范围3.4E-38~3.4E+38,提供七个有效数字 ...4.后缀为lf或LF表示双精度浮点型(若无后缀则默认为double) 单双精度浮点型之间的赋值 1.将float类型的变量赋...
  • MATLAB的数据类型整型和浮点型

    千次阅读 2018-08-08 10:31:53
    前者的整型数据主要为图像处理等特殊的应用问题提供数据类型,而对于一般数值运算,绝大多数是采用双精度浮点型的数据。 8种整数类型: 整数类型 数值类型 转换函数 有符号8...
  • (2)double:双精度浮点型,8字节,64bit。 二,浮点型内存空间的分配 浮点型内存空间分为4部分: (1)符号位:用于保存浮点数的正负号; (2)指数符号位:用于保存指数位的正负号; (3)指数位:影响浮点数的...
  • 双精度是这样的格式,1 位符号,11 位指数,52 为小数,有效位数为 15 位。说明:取值范围取决于指数位,计算精度取决于小数位(尾数)。小数位越多,则能表示的数越大,那么计算精度则越高。float的指数部分有8bit(2^...
  • 浮点型的存储方式

    2017-07-25 09:12:46
    浮点型的存储方式及实例: 是单精度还是双精度在存储中都分为三个部分(float为例): 符号位(Sign) : 0代表正,1代表为负 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储(中间八位) ...
  • 浮点型 2020年10月31日 23:32 IEEE浮点标准用V=(-1)s×M×2E表示一个浮点数。 符号s决定该数为正数还是负数 尾数M是二进制小数 阶码E作用是浮点数加权 更具exp阶码值划分三种情况: 1)规格化 2)非规格化 3)...
  • 浮点型还包括长双精度型 1、整型数据 包括整型变量和整型常量 1)整型变量: -基本类型为int型,在整型的表示符号int前加上不同的修饰符,就可以将int型扩展成别的类型,如short int -用有符号(signed)和无符号...
  • 1, C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。...● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。...
  • 语言提供了几个标准库函数,可以...● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。 ● fcvt():指定位数为转换精度,其余同ecvt()。 除此外,还可以使用sprintf系列函数把数字转换成字符串
  • 对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数)   1、其第31 bit为符号位,为0则表示正数,反之为负数,其读数值用s表示;  2、第30~23 bit为幂数,其读数值用e...
  • [注明] 现有的Intel中的SSE指令 cvtps2dq XMM,XMM/m128 支持把源存储器4个单精度浮点数变成4个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节,另外还有其他指令支持双精度和整型的转换。...
  • 浮点型转换整型的快速方法介绍

    千次阅读 2016-01-05 10:56:00
    [注明] 现有的Intel中的SSE指令 cvtps2dq XMM,XMM/m128 支持把源存储器4个单精度浮点数变成4个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节,另外还有其他指令支持双精度和整型的转换。...
  • doubble双精度浮点数 整形家族 首先,对于整形家族来说,有原码,反码,补码三种数据来表示。首先我们要明白各种码的作用 原码:我们在计算机中看到的数字直接翻译成的二进制数字。(字符在则是翻译成对应的ASCII...
  • [注明] 现有的Intel中的SSE指令cvtps2dq XMM,XMM/m128 支持把源存储器4个单精度浮点数变成4个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节,另外还有其他指令支持双精度和整型的转换。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 569
精华内容 227
热门标签
关键字:

双精度浮点型符号