今天看视频讲座的时候忽然发现浮点数的内存表示居然不会,从网上抄点先放着.
浮点数在c/c++以及java中的内存布局遵循IEEE标准的,首先看一下IEEE所规定的存储的方式:
原码 补码 反码 移码
符号位 指数位 小数部分 指数偏移量
单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127
双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023
解释一下,首先float变量按上述标准是4个字节,其中最高位为符号位,1代表此浮点数为负数,0代表正数,接下来的8位为指数位,范围0~255,,IEEE规定了一个偏移量127,指数位的值减去127为小数的偏移。低23位为小数部分,这23位是来描述浮点数的值,偏移为0的情况下,这23位数是一个浮点数的小数部分,也就是说位于小数点的右边。比如
0x3fc00000
符号位:0 ->说明是正数。
指数位:011 1111 1 -->偏移0
小数位:100 0000 0000 0000 0000 0000,-->1.10000000000000000000000为1.5
而按照规定,小数点前还隐含包括1,而这个1是不储存的,所以小数位实际是1.5,当偏移大于0时,小数点向右偏移相应的值,反之向左偏移相应的值。
以上就是IEEE的存储的基本原理,现在验证下,加深印象
#include <iostream><br>using namespace std; <br>int main() <br>{ <br> float a=0.0; <br> unsigned char *p=(unsigned char *)&a; <br> *p=0; <br> p++; <br> *p=0; <br> p++; <br> *p=0xc0; <br> p++; <br> *p=0x3f; <br> cout system("pause"); <br>} <br>//输出1.5 <br>0x40c00000 <br>符号位:0 ->说明是正数。 <br>指数位:100 0000 1 -->偏移2</iostream>
小数位:100 0000 0000 0000 0000 0000,
由于偏移为2,1.100 0000 0000 0000 0000 0000变成了110.0 0000 0000 0000 0000 0000 所以0x40c00000值为6,同理0x3f400000值为0.75.
类似的我们可以明白double变量的内存布局了。由于小数位的计算方式比如11.11111...在计算时为1*2^1+1*2^0+1*2^(-1)+1*2^(-2)....可以看出在表示小数时,flaot的值不是连续的,事实上浮点数,以IEEE标准所能精确表示的仅仅是其中的一部分。
例如0.3,就不能被float所精确表示,如下面代码:
#include <iostream><br>using namespace std; <br>int main() <br>{ <br> float a=0.3; <br> cout.precision(20); <br> for (int i=0;i { <br> cout } <br> cout system("pause"); <br>} <br>可以算出float所能精确表示的个数,32位每位两个有限的状态~~~~~ <br>了解了float布局,相应的下面代码问题的原因也就找到了~~~~</iostream>
#include <iostream><br>using namespace std; <br>int main() <br>{ <br> float a=2; <br> int *p=(int*)&a; <br> cout cout system("pause");</iostream>
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Demon__Hunter/archive/2008/12/20/3566232.aspx
分享到:
相关推荐
浮点数在内存中的表示方法.pdf浮点数在内存中的表示方法.pdf浮点数在内存中的表示方法.pdf浮点数在内存中的表示方法.pdf浮点数在内存中的表示方法.pdf浮点数在内存中的表示方法.pdf
float浮点数要比同为4字节的int定点数表示的范围大的多,那么是否可以使用浮点数替代定点数? 为什么float型浮点数9.87654321 > 9.87654322不成立?为何10.2 - 9的结果不是1.2,而是1.1999998?为何987654321 + ...
查看内存中十六进制数据表示的浮点书大小,在串口通信编程中非常有用的一个小工具.
符合IEEE-754标准的单精度浮点形数据,C51里用4字节存储一个浮点数,如用0x3F000000表示小数0.5;0xBDCCCCCD表示小数-0.1。一般我们还是习惯用十进制来表示容易看。但有的时候我们需要知道一个十进制的小数保存到...
c语言实现,查看使十进制的二进制模式(32位)
本程序对浮点数和16进制数据做转换,方便人员查看浮点数制在计算机内存中的表示形式
但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法。在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M)。对于float型数据,其...
时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: 无限制 Description 在计算机中,用float或double来存储小数有时不能得到精确值,若要精确表达一个浮点数的计算结果, 最好用分数...
C/C++的浮点数在内存中的存储方式分析 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) ...
浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于...
自己编写的一个可以查看各种数据类型的数据在内存中的二进制组织方式的小软件,比如浮点数1在内存中的表示是0X3F 80 00 00 而整数1在内存中的表示方式是0X00 00 00 01。软件很简单,但在程序开发时尤其是设计到上下...
时间限制:1000MS 内存限制:1000K 提交次数:0 通过次数:0 题型: 编程题 语言: 无限制 Description 在计算机中,用float或double来存储小数有时不能得到精确值,若要精确表达一个浮点数的计算结果, 最好用分数来...
浮点数储存至内存中时,2的-1、-2……-n次方不能精确的表示小数部分,所以再把这个数从地址中取出来进行计算就出现了偏差。 package main import ( errors fmt github.com/shopspring/decimal ) func ...
在开始本文之前,让我们先来谈谈浮点数为什么缺乏精确性的问题,其实这不是Python的问题,而是实数的无限精度跟计算机的有限内存之间的矛盾。 举个例子,假如说我只能使用整数(即只精确到个位,计算机内的浮点数也...
关于java虚拟机的详细解析,从内存分析到垃圾回收算法,hotspot虚拟机回收机制的详细分析,欢迎下载!
格式:cbfi 0xXXXXXXXX 表示将二进制布局转换为浮点数,只有 16、32、64 位有效。 cbfi XXXXX.XX 表示转换为浮点的二进制布局此外,您可以使用 -d 选项来显示您可能需要的更多信息。 示例:<22>pli[9903]@~/...
【问题描述】 ...平均占用内存:1.415K 平均运行时间:0.00648S 测试数据 评判结果 测试数据1 完全正确 测试数据2 完全正确 测试数据3 完全正确 测试数据4 完全正确 测试数据5 完全正确 详细
时间限制: 1000 ms 内存限制: 65536 KB 提交数: 52945 通过数: 28955 【题目描述】 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。 【输入】 第一行有一个整数n...
在预测的同时,根据IEEE754浮点数标准,简化浮点数的尾数,使用3.5 Byte来表示一个浮点数,以提高压缩效果;然后对预测数据中连续重复的字节使用该字节加该字节重复的次数的方式存储;最后对经过以上处理的数据...
通过将顶点或纹理指定为16位浮点数,可以节省视频内存,缩短缓冲区上载时间并加快绘制速度。 除OpenGL外,16位浮点数还用于许多图像格式,例如OpenEXR,以实现高动态范围和深色。 ###限制16位浮点数的范围和精度远...