精华内容
下载资源
问答
  • 首先,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

    展开全文
  • 浮点数和十六进制的相互转换,包括:1.单精度浮点数(32位)和十六进制的相互转换,2.双精度浮点数(64位)和十六进制的相互转换。
  • C++双精度浮点格式,仅供参考

    千次阅读 2019-12-26 11:10:43
    #include <stdlib.h> #include <stdio.h> #include <stdint.h> typedef union { double f; uint32_t i[2]; }Packet; #define M ((1<<20)-1) void test( double f) ......
    #include <stdlib.h>
    #include <stdio.h>
    #include <stdint.h>
    
    typedef union
    {
       double f;
       uint32_t i[2];
    }Packet;
    
    #define M  ((1<<20)-1)
    void test( double f)
    {
      Packet p;
      p.f=f;
      printf("f1 = %.16f ~= (1.0+%u/2^20)*2^%u\n", p.f, p.i[1]&M, (p.i[1]>>20)-1023 );
    }
    
    int main(int argc, char* argv[] )
    {
       double f;
       printf("Please input a double?");
       scanf("%lf",&f);
       test(f);
       return 0;
    }

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

    千次阅读 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 么!



    展开全文
  • 1、在发送端定义一个发送数据 a = 12; 2、与网络通信助手连接后,生成的hex值为:0C 00 00 00 ...该如何编写接收端的代码才能才能把双精度浮点型的数据转换成十进制数据? 请大佬们帮忙!感谢!欢迎交流!
  • 两个数字计算器(双精度浮点型

    千次阅读 2016-03-24 12:58:00
    主类Demo: ... import java.util.Scanner; ...public class Demo { ... System.out.println("您输入的符号不是正常符号,请重新输入!!!!!"); } } } 转载于:https://www.cnblogs.com/lwkblog/p/5315065.html

    主类Demo:

    package com.lwk.calculator.test;

    import java.util.Scanner;

    public class Demo {

    /**
    * @param args
    */
    public static void main(String[] args) {

    Calculator cal = new Calculator();
    Scanner input = new Scanner(System.in);
    System.out.print("请输入num1:");
    double num1 = input.nextDouble();
    cal.setNum1(num1);
    System.out.print("请输入符号:");
    String sign = input.next();
    cal.setSign(sign);
    System.out.print("请输入num2:");
    double num2 = input.nextDouble();
    cal.setNum2(num2);
    cal.cal();

    }

    }

     

    //Calculator类

    package com.lwk.calculator.test;

    public class Calculator {

    private double num1;
    private double num2;
    private String sign;

    public double getNum1() {
    return num1;
    }

    public void setNum1(double num1) {
    this.num1 = num1;
    }

    public double getNum2() {
    return num2;
    }

    public void setNum2(double num2) {
    this.num2 = num2;
    }

    public String getSign() {
    return sign;
    }

    public void setSign(String sign) {
    this.sign = sign;
    }

    public void cal() {
    if ("+".equals(getSign())) {
    System.out.print("结果是:" + (num1 + num2));
    } else if ("-".equals(getSign())) {
    System.out.print("结果是:" + (num1 - num2));
    } else if ("*".equals(getSign())) {
    System.out.print("结果是:" + (num1 * num2));
    } else if ("/".equals(getSign())) {
    System.out.print("结果是:" + (num1 / num2));
    } else {
    System.out.println("您输入的符号不是正常符号,请重新输入!!!!!");
    }
    }
    }

    转载于:https://www.cnblogs.com/lwkblog/p/5315065.html

    展开全文
  • 双精度浮点数(double)       Decimal为SQL Server、MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小数部分的位数。使用精确小数类型不仅能够保证数据计算更为精确,还可以节省...
  • 双精度浮点数double

    千次阅读 2019-03-09 12:28:24
    双精度浮点数(double)是计算机使用的一种数据类型。比起单精度浮点数,双精度浮点数(double)使用 64 位(8字节) 来存储一个浮点数。 它可以表示十进位制的15或16位有效数字。 sign bit(符号): 用来表示正负号 ...
  • 参考深入理解C语言-03-有符号数,定点,浮点数 1.1定点 一般在没有FPU寄存器的嵌入式系统中使用比较多。比如常见的32位系统中,将高16位作为整数部分,低16位作为小数部分。 这样就可以用整数来模拟定点的.....
  • 前言 对于十进制的整数使用二进制表示很...例如,十进制0.125可表示为二进制0.001,怎么得来的?简单的计算可以用0.125不断乘2,结果小于1将二进制位记为0,结果大于1时将二进制位记为1: 0.125 * 2 = 0.25 二进制
  • C语言中双精度浮点型什么意思

    千次阅读 2008-10-20 09:40:00
    双精度型占8 个字节(64位)内存空间 其数值范围为3.4E-38~3.4E+38 double(双精度说明符) 单精度占4个字节(32位)内存空间 float(单精度说明符) 其数值范围为1.7E-308~1.7E+308 只能提供七位有效数字 可...
  • 单精度浮点数和双精度浮点数Here you will learn about difference between float and double i.e. float vs double. 在这里,您将了解float和double的区别,即float vs double。 These are two commonly used ...
  • 基础知识: 十进制转十六进制;...这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2—— 即把一个浮点数表示为尾数乘以2 的指数次方再添上符号。下面是具体的规格:  符号位 
  • 单精度浮点数与双精度浮点数区别

    千次阅读 2020-04-06 15:14:35
    双精度浮点数使用 8个字节(64位)存储空间来存储一个浮点数,包括符号位1位,阶码11位,尾数52位。 2、所存的数值范围不同 单精度浮点数的数值范围为-3.4E38~3.4E38,而双精度浮点数可以表示的数字的绝对值范围...
  • 单精度和双精度浮点数数据类型

    千次阅读 2016-07-16 09:58:44
    C、C++中使用到的单精度浮点数(float)类型和双精度浮点数(double)类型是在IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985)中定义的。下面分别从存储格式、内存分布、编码规则、取值范围、有效数字位数和...
  • JS中使用IEEE-754规定的双精度浮点数,所有的算法也都符合IEEE-754规定的双精度浮点数运算。 双精度浮点数是一种64位(64 bit)的二进制数字格式。包括3个组成部分: 符号位 1位 阶码(指数部分) 11位 尾数(有效...
  • 单精度float与双精度double

    千次阅读 2020-01-31 17:07:01
    单精度 双精度: 单精度,也即float,一般在计算机中存储占用4字节,也32位,有效位数为7位;双精度(double)在计算机中存储占用8...双精度格式:1位符号,11位指数,52位小数。 float是单精度浮点数(32位)...
  • 尾数的符号Sf代表浮点数的正负。” “一旦浮点数的位数确定后,合理分配阶码和尾数的位数,直接影响浮点数的表示范围和精度。通常对于短实数(总位数为32位),阶码取8位(含阶符一位),尾数取24位(含符一位...
  • C语言 单精度和双精度实数输出

    千次阅读 2019-02-04 10:50:26
    C语言 单精度和双精度实数输出 有意义数字和无意义数字的演示
  • 浮点型数据精度不准确的探究

    千次阅读 2018-10-11 14:52:35
    今天来谈一下这个问题, 文章会涉及到以下几个方面: 1.浮点型的范围和精度 2.为什么浮点型会精度丢失 ...float即单精度浮点数, 大小为4个字节共32位, double即双精度浮点数, 大小为8个字节共64位。就如上图所表述的...
  • c语言双精度的格式说明符Format specifiers define the type of data to be printed on standard output. You need to use format specifiers whether you're printing formatted output with printf() or accepting...
  • 在C/C++中float是32位的,double是64位的,两者在内存中的存储方式和能够表示的精度均不同,目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。 无论是float还是double,在内存中的存储...
  •      C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit。单精度类型和双精度类型在计算机存储格式如下所示: 图1 浮点类型的...
  • 符号位 Sign(S): 1bit (b31) 指数部分Exponent(E): 8bit (b30-b23) 尾数部分Mantissa(M): 23bit (b22-b0) 其中的指数部分(E)采用的偏置码(biased)的形式来表示正负指数,若E<127则为负的指数,否则为非负...
  • 关于16进制浮点数对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数),1、其第31 bit为符号位,为0则表示正数,反之为复数,其读值用s表示;2、第30~23 bit为幂,其读...
  • 功能函数,其中BYTE 为unsigned char double B2D(BYTE *pData) { //double 的格式8个字节 ... //获取符号位,1表示负数,0表示正数; int sign = int(pData[0] >> 7); cout << "sign= ...
  • scanf 输入双精度浮点数

    千次阅读 2014-01-10 16:46:46
    %f是但进度浮点数的格式双精度浮点数应用%lf,改一下就行了 因为double是8个字节的,float是4个字节的,%f 的格式就是4个字节的,而 %lf 就是8个字节的#include #include int main( void ) { double x; scanf("%lf...
  • 二、了解IEEE 754双精度浮点数规范 1) 通过2进制的科学计数法存储。 和10进制的科学计数法类似,二进制的科学技术法格式为1.xxx*2^N。其中需要留意下二进制科学计数法的整数部分都是1,所以在存储时省略整数部分1。...
  • 双精度和单精度分别占8字节、4字节,在与下位机进行通信时,经常遇到一种请况:一个量是小数形式—>也就是双精度或者单精度。在通信协议中,却只有两个字节的的大小表示该量,很名显,这就存在两个问题。 第一,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,612
精华内容 17,844
关键字:

双精度浮点型符号