1. C语言中,单精度浮点型只占32位,但为什么能表示3.4E-38~3.4E+38的范围
浮点型的存储方式和整型的存储方式不同,整型是所有二进制位都表示那个整数,而浮点型则将二进制位分成了符号位、整数位、小数位、指数位。由于部分二进制位被用来存储指数了,所以其精度就降低了,即有效数字位数变少了,但由于有指数位,所以可以表示很大的数。 具体详情请参考有关资料。
2. C语言浮点数的储存方式为何浮点数储存不准确那个图片是什么意思
C语言中,无论是单精度还是双精度在存储中都分为三个部分:
1. 符号位(Sign) : 0代表正,1代表为负
2. 指数位(Exponent)(注:也叫阶码):用于存储科学计数法中的指数数据,并且采用移位存储(注:移码编码表示)
3. 尾数部分(Mantissa):尾数部分
关于不精确是由于十进制小数部分化二进制,常常化不尽。如同无限循环小数,最后有截断误差。
图片中的是float型的变量的存储上的格式。
3. 关于浮点型float数值是怎样在内存中存储的
单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。double float数据类型,计算机中表示实型变量的一种变量类型。此数据类型与单精度数据类型(float)相似,但精确度比float高,编译时所占的内存空间依不同的编译器而有所不同,通常情况,单精度浮点数占4字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,;双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308。
4. 浮点数的存储结构是怎样的
浮点数存储时有符号位,阶数位和尾数三部分组成。
解:最大的正数= (1-2 ^ (7))x 2 ^ (2 ^ (3) - 1) = (1-2 ^ (7)) x 2 ^(7) = 127,规则最小的正数=2×2^(-1)(或2^(3))x^2=2-1=2^(8)(9)=1/512。
最明显的绝对值是-1*2^(2^3-1)也就是-1*2^7,也就是-128。
(4)浮点型存储385扩展阅读:
浮点数A由两个数字m和e表示:A=m*b^e。在任何这样的系统中,我们选择基数b(计数系统的基础)和精度p(要存储的比特数)。
M(即尾数)的形状为±d.dd…DDD的p位(每个位是0和b-1之间的整数,包括0和b-1)。如果m的第一个数字是一个非零整数,那么m就被归一化了。
一些描述使用单个符号位(s表示+或-)表示加号或减号,因此m必须是正数。E是a的指数。
结构:
表示计算机中的一个浮点数,其结构如下:
尾数部分(定点小数)指令码部分(定点整数)
5. 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(二进制0111 1111),double类型指数的起始数为1023(二进制011 1111 1111),在此基础上加指数,得到的就是内存中指数的表示形式。尾数则直接填入,如果空间多余则以0补齐,如果空间不够则0舍1入。所以float和double类型分别表示的2.5如下(二进制):
符号位
指数
尾数
0
1000 0000
010 0000 0000 0000 0000 0000
0
100 0000 0000
0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
6. C/C++浮点数在内存中是怎么存储的
把浮点数的绝对值的二进制表达的小数点移动到从左至右数第1个“1”之后,舍去1和小数点,把剩余的原码二进制0、1序列从左至右截取23(float型)或52(double型)位作为尾数。
在尾数前添加8(float型)或11(double型)位用移码表示“制造”尾数时小数点移动的位数,叫阶码;阶码的最左那一位表示小数点移动的方向。
在阶码前添加1位表示整个浮点数的正负,0表示大于等于0,1表示小于0。
把这一串0、1序列在小端机上由右至左存储在某个地址开始的连续内存单元中,这“某个地址”就是承载这个浮点型数据的变量的地址。若在大端机上则将这一串0、1序列由左至右存放。
7. 请问浮点型数据在计算机是怎么存储的
对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit。
无论是单精度还是双精度在存储中都分为三个部分:
1、符号位(Sign) : 0代表正,1代表为负。
2、指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储。
3、尾数部分(Mantissa):尾数部分。
(7)浮点型存储385扩展阅读
实型变量分为两类:单精度型和双精度型,
其类型说明符为float 单精度说明符,double
双精度说明符。在Turbo
C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。
双精度型占8
个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
实型变量说明的格式和书写规则与整型相同。
例如: float x,y; (x,y为单精度实型量)
double a,b,c; (a,b,c为双精度实型量)
实型常数不分单、双精度,都按双精度double型处理。
8. 浮点型数据在内存中实际的存放形式(储存形式)
浮点型数据在内存中存储不是按补码形式,是按阶码的方式存储,所以虽然int和float都是占用了4个字节,如果开始存的是int型数据,比如是个25,那么用浮点的方式输出就不是25.0,也许就变的面目全非。
你可以用共用体的方式验证一下。在公用体中定义一个整形成员变量和一个浮点型成员变量,给整形赋值25,输出浮点成员变量,你就知道了。
9. C语言实型(浮点型)数据在内存中的存放形式
实数分为float型和double型,它们分别对应IEEE 754标准中的单精度浮点数和双精度浮点数类型,在内存中的存储形式遵守IEEE 754浮点数标准。以float类型数据为例,3.14159表示成二进制为11.0010010000111111001111......,规格化后表示为1.10010010000111111001111×2^1(小数点后保留23位有效数字,因为IEEE 754标准规定的尾数为23位);指数为1,故阶码为1+127=128=10000000;这是一个正数故符号位为0,因此它在内存中的表示形式是0 10000000 10010010000111111001111,写成16进制为40490FCF。
10. float变量在内存当中是怎样存储的或是怎样的一种存储格式
浮点型变量在计算机内存中占用4字节(Byte),即32-bit。遵循IEEE-754格式标准。
一个浮点数由2部分组成:底数m 和 指数e。
±mantissa × 2exponent
(注意,公式中的mantissa 和 exponent使用二进制表示)
底数部分使用2进制数来表示此浮点数的实际值。
指数部分占用8-bit的二进制数,可表示数值范围为0-255。但是指数应可正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数。所以float的指数可从 -126到128.
底数部分实际是占用24-bit的一个值,由于其最高位始终为 1 ,所以最高位省去不存储,在存储中只有23-bit。
到目前为止, 底数部分 23位 加上指数部分 8位 使用了31位。那么前面说过,float是占用4个字节即32-bit,那么还有一位是干嘛用的呢? 还有一位,其实就是4字节中的最高位,用来指示浮点数的正负,当最高位是1时,为负数,最高位是0时,为正数。
浮点数据就是按下表的格式存储在4个字节中:
Address+0 Address+1 Address+2 Address+3
Contents SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S: 表示浮点数正负,1为负数,0为正数
E: 指数加上127后的值的二进制数
M: 24-bit的底数(只存储23-bit)
主意:这里有个特例,浮点数 为0时,指数和底数都为0,但此前的公式不成立。因为2的0次方为1,所以,0是个特例。当然,这个特例也不用认为去干扰,编译器会自动去识别。
通过上面的格式,我们下面举例看下-12.5在计算机中存储的具体数据:
Address+0 Address+1 Address+2 Address+3
Contents 0xC1 0x48 0x00 0x00 接下来我们验证下上面的数据表示的到底是不是-12.5,从而也看下它的转换过程。
由于浮点数不是以直接格式存储,他有几部分组成,所以要转换浮点数,首先要把各部分的值分离出来。
Address+0 Address+1 Address+2 Address+3
格式 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
二进制 11000001 01001000 00000000 00000000
16进制 C1 48 00 00
可见:
S: 为1,是个负数。
E:为 10000010 转为10进制为130,130-127=3,即实际指数部分为3.
M:为 10010000000000000000000。 这里,在底数左边省略存储了一个1,使用 实际底数表示为 1.10010000000000000000000
到此,我们吧三个部分的值都拎出来了,现在,我们通过指数部分E的值来调整底数部分M的值。调整方法为:如果指数E为负数,底数的小数点向左移,如果指数E为正数,底数的小数点向右移。小数点移动的位数由指数E的绝对值决定。
这里,E为正3,使用向右移3为即得:
1100.10000000000000000000
至次,这个结果就是12.5的二进制浮点数,将他换算成10进制数就看到12.5了,如何转换,看下面:
小数点左边的1100 表示为 (1 × 23) + (1 × 22) + (0 × 21) + (0 × 20), 其结果为 12 。
小数点右边的 .100… 表示为 (1 × 2-1) + (0 × 2-2) + (0 × 2-3) + ... ,其结果为.5 。
以上二值的和为12.5, 由于S 为1,使用为负数,即-12.5 。
所以,16进制 0XC1480000 是浮点数 -12.5 。
上面是如何将计算机存储中的二进制数如何转换成实际浮点数,下面看下如何将一浮点数装换成计算机存储格式中的二进制数。
举例将17.625换算成 float型。
首先,将17.625换算成二进制位:10001.101 ( 0.625 = 0.5+0.125, 0.5即 1/2, 0.125即 1/8 如果不会将小数部分转换成二进制,请参考其他书籍。) 再将 10001.101 向右移,直到小数点前只剩一位 成了 1.0001101 x 2的4次方(因为右移了4位)。此时 我们的底数M和指数E就出来了:
底数部分M,因为小数点前必为1,所以IEEE规定只记录小数点后的就好,所以此处底数为 0001101 。
指数部分E,实际为4,但须加上127,固为131,即二进制数 10000011
符号部分S,由于是正数,所以S为0.
综上所述,17.625的 float 存储格式就是:
0 10000011 00011010000000000000000
转换成16进制:0x41 8D 00 00
所以,一看,还是占用了4个字节。
下面,我做了个有趣的实验,就是由用户输入一个浮点数,程序将这个浮点数在计算机中存储的二进制直接输出,来看看我们上面所将的那些是否正确。
有兴趣同学可以到VC6.0中去试试~!
#include<iostream.h>
#define uchar unsigned char
void binary_print(uchar c)
{
for(int i = 0; i < 8; ++i)
{
if((c << i) & 0x80)
cout << '1';
else
cout << '0';
}
cout << ' ';
}
void main()
{
float a;
uchar c_save[4];
uchar i;
void *f;
f = &a;
cout<<"请输入一个浮点数:";
cin>>a;
cout<<endl;
for(i=0;i<4;i++)
{
c_save[i] = *((uchar*)f+i);
}
cout<<"此浮点数在计算机内存中储存格式如下:"<<endl;
for(i=4;i!=0;i--)
binary_print(c_save[i-1]);
cout<<endl;
}
好了,我想如果你仔细看完了以上内容,你现在对浮点数算是能比较深入的了解了。