`
iwebcode
  • 浏览: 1997583 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

float和double类型的内存分布和比较方法

 
阅读更多

C/C++的浮点数据类型有float和double两种。

类型float大小为4字节,即32位,内存中的存储方式如下:

符号位(1 bit) 指数(8 bit)尾数(23 bit)

类型double大小为8字节,即64位,内存布局如下:

符号位(1 bit)指数(11 bit) 尾数(52 bit)

符号位决定浮点数的正负,0正1负。

指数和尾数均从浮点数的二进制科学计数形式中获取。

如,十进制浮点数2.5的二进制形式为10.1,转换为科学计数法形式为(1.01)*(10^1),由此可知指数为1,尾数(即科学计数法的小数部分)为01。

根据浮点数的存储标准(IEEE制定),float类型指数的起始数为127(二进制01111111),double类型指数的起始数为1023(二进制011 11111111),在此基础上加指数,得到的就是内存中指数的表示形式。尾数则直接填入,如果空间多余则以0补齐,如果空间不够则0舍1入。所以float和double类型分别表示的2.5如下(二进制):

符号位 指数 尾数

0 1000 0000 010 00000000 0000 0000 0000

0 100 0000 0000 01000000 0000 0000 0000 0000 0000

0000 0000 0000 00000000 0000

浮点数2.5可以用二进制小数准确表示(2.5=1*(2^1)+0*(2^0)+1*(2^-1)),但很多小数不可以准确表示,其二进制形式的小数部分会无限循环,如浮点数-1.2表示如下(二进制):

符号位 指数 尾数

1 0111 1111 0011 00110011 0011 0011 010

1 011 1111 1111 00110011 0011 0011 0011 0011 0011

0011 0011 0011 00110011 0011

由于对无限循环尾数的截取遵循0舍1入,尾数的第21~24位为0011,第53~56位为0011,而float尾数容量为23位,double尾数容量为52位,所以,float形式的最后三位因进位而成010,double形式则没有进位发生。

类型float和double通过==,>,<等比较不会引起编译错误,但是非常可能得到错误的结果。这是因为它们的内存分布不同,不可以直接比较。正确的方法是转换为同一类型后比较两者差值,如果结果小于规定的小值,则视为相等

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/vinsendai/archive/2008/06/27/2593035.aspx

分享到:
评论

相关推荐

    C++单精度与双精度浅析.pdf

    C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,...

    浮点数在计算机中的存储方式

    C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,...

    Java中变量内存分配机制

     在任何编程语言中,无论是基本类型还是引用类型,不论其作用域如何,都必须为其分配一定的内存空间,Java 语言也不例外,Java 的数据类型可以分为两种:基本类型(变量持有数据本身的值)和引用类型(是某个对象...

    浮点数在计算机中存储方式是怎样的

    C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,...

    Objective-C2.0程序设计

    4.1.3 double类型 4.1.4 char类型 4.1.5 限定词:long、long long、short、unsigned及signed 4.1.6 id类型 4.2 算术表达式 4.2.1 运算符的优先级 4.2.2 整数运算和一元负号运算符 4.2.3 模运算符 4.2.4 整型值和浮点...

    详解C#数据类型及其转换

    值类型的变量在声明后,系统直接在托管栈中为其分配内存并保存其数据,其中值类型包括:byte,short,int,long,float,double,decimal,char,bool 和 struct等,当我们声明一个引用类型时,系统并不会立刻在托管...

    第一章程序设计基础知识板块第一节内容

    25 对于double型变量,内存分配_______个字节 26结构化程序设计的基本数据类型包括_______、逻辑类型、整数类型、字符类型 27 Java使用____________字符集 28 混合运算中不同类型的数据先转化为同一类型,然后运算,...

    C++零基础(数据类型)

    4 实型(单精度浮点型以float表示 `双精度浮点型以double表示) long可以用来修饰int(表示长整型)和double 5 signed(有符号) 和 unsigned(无符号)⊥可以用来修饰char型和int型(包括long int) ⊥ ⊥ 6 有符号 ...

    C语言学习笔记

    数据类型可以理解为固定内存大小的别名,数据类型是创建变量的模子。 char 1字节 short 2字节 int 4字节 long 4字节 float 4字节 double 8字节 变量是一段实际连续存储空间的别名,通过变量的名字可以使用存储...

    Java数组详解(Java基础)

    (1)基本类型 byte short int long float double char boolean (2)引用类型 类 数组 接口 枚举 注解 变量:内存中的一块存储空间, 存储的就是常量。 特点:一个变量只能存储一个数据,不能存储多个。 需求:...

    C语言程序设计标准教程

    其类型说明符为float 单精度说明符,double 双精度说明符。在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围...

    超级有影响力霸气的Java面试题大全文档

     基本数据类型包括byte、int、char、long、float、double、boolean和short。  java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int...

    你必须知道的495个C语言问题

    事实上,能够确保的只有如下几点: …… 目录第1章 声明和初始化 第2章 结构、联合和枚举第3章 表达式第4章 指针第5章 空指针第6章 数组和指针第7章 内存分配 第8章 字符和字符串 第9章 布尔表达式和...

    java 面试题 总结

    基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 ...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    12.4.2 BINARY_FLOAT/BINARY_DOUBLE类型的语法和用法 513 12.4.3 非固有数值类型 513 12.4.4 性能考虑 514 12.5 LONG类型 515 12.5.1 LONG和LONG RAW类型的限制 516 12.5.2 处理遗留的LONG类型 517 12.6 DATE...

    小白的20天Java学习打卡day3

    数据类型的作用是指导JVM在运行程序的时候给该数据分配多大的内存空间。 ​②java中的数据类型: 基本数据类型 引用数据类型【后面讲】 * 类 * 接口 * 数组 * … ​③基本数据类型 基本数据类型包括四大类八小种: ...

    C语言FAQ 常见问题列表

    然后又使用一些内存分配技巧使 namestr 数组用起来好像有多个元素。这样合法和可移植吗? o 3.7 是否有自动比较结构的方法? o 3.8 如何向接受结构参数的函数传入常数值? o 3.9 怎样从/向数据文件读/写结构? ...

Global site tag (gtag.js) - Google Analytics