zoukankan      html  css  js  c++  java
  • float & double 内存布局

    float double 存储问题

       C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit, 无论是单精度还是双精度在存储中都分为三个部分:

      首先说一下原,反,补,移码. 移码其实就等于补码,只是符号相反. 对于正数而言,原,反,补码都一样, 对负数而言,反码除符号位外,在原码的基础上按位取反,补码则在反码的基础之上,在其最低位上加1,要求移码时,仍然是先求补码,再改符号. 

    1. 符号位(Sign) : 0代表正,1代表为负
    2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储  

      A,阶码是用移码表示的,这里会有一个127的偏移量,它的127相当于0,小于127时为负,大于127时为正,比如:10000001表示指数为129- 127=2,表示真值为2^2,而01111110则表示2^(-1). 

    有移码表示阶码有是有原因的,主要是移码便于对阶操作,从而比较两个浮点数的大小. 这里要注意的是,阶码不能达到11111111的形 式,IEEE规定,当编译器遇到阶码为0XFF时,即调用溢出指令.  总之,阶码化为整数时,范围是:-127~127.

    float:   符号位1,阶码08(固定偏移     7F),尾数23,固定隐含位有 
    double: 符号位1,阶码11(固定偏移   3FF),尾数52,固定隐含位有 
    long   double:符号位1,阶码15(固定偏移3FFF),尾数64,固定隐含位无 
    某些编译器中把long   double作double处理 
    1. 尾数部分(Mantissa):尾数部分

    其中float的存储方式如下图所示:

    float类型的存储方式


     单精度浮点数8.25的存储方式

    而双精度的存储方式为:

    double类型数据的存储方式 

         


    2 精度

    float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。

    float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;

    double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。 

    注:本文在写作过程中,参照了如下资料:

    http://www.msdn.net/library/chs/default.asp?url=/library/CHS/vccore/html/_core_why_floating_point_numbers_may_lose_precision.asp

    http://blog.csdn.net/ganxingming/archive/2006/12/19/1449526.asp

    http://blog.csdn.net/hziee_/archive/2007/01/08/1477427.aspx

     http://blog.csdn.net/biblereader/article/details/819428

  • 相关阅读:
    Dagger2 (二) 进阶篇
    Dagger2 (一) 入坑篇
    RoboGuice 3.0 (三)总结篇
    RoboGuice 3.0 (二)进阶篇
    RoboGuice 3.0 (一)入坑篇
    spring源码
    Java transient关键字使用
    Spring源码学习
    jvm系列(一):java类的加载机制
    Java中newInstance()和new()
  • 原文地址:https://www.cnblogs.com/yaozhongxiao/p/1821185.html
Copyright © 2011-2022 走看看