c语言浮点数存储
首先一点就,是DOUBLE类型是不能自动转成INT类型的,所以结果会出现不知所云的数.
另外,C的话浮点数一般是用IEEE 754标准定义的单精度浮点数与双精度浮点数。
这些浮点数都是会损失精度的,在计算中会带来偏差。
2. C语言中DOUBLE型数据储存结果
float与double类型的内存分布,精度和范围
内存分布:
C/c++的浮点数据类型有float和double两种。
float大小为4字节,内存中的存储方式如下:
符号位(1bit)指数(8bit)尾数(23bit)
double大小为8字节,内存中的存储方式如下:
符号位(1bit)指数(11bit)尾数(52bit)
符号位决定浮点数的正负,0正1负。指数和尾数均从浮点数的二进制科学计数形式中获取。
如,十进制浮点数2.5的二进制形式为10.1,转换为科学计数法形式为(1.01)*(10^1)。
由此可知指数为1,尾数(即科学计数法的小数部分)为01。
根据浮点数的存储标准,指数用移码表示。0的float类型移码为127(0111 1111),0的double类型移码为1023(011 1111 1111)。运算时,在0 的移码基础上加指数,得到的就是内存中指数的表示形式。尾数则直接填入,如果空间多余则以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
精度:
float和double的精度是由尾数的位数来决定的。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字; double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
范围:
float类的指数是8位移码,最大为127最小为-127,127用来作2的指数,为2^127,约等于 1.7014*10^38, 而我们知道,floa示数范围约为- 3.4*10^38-------3.4*10^38, 这是因为尾数都为1时,即1.11..11约为2,因此浮点数的范围就出来了.double的情况与float完全相似.
3. C语言中反汇编浮点数存储
纠正一下一个认知,数据的类型并不是固定的,而是看你程序的操作,如果操作的是mul,就认为那里是整数,如果操作指令是fmul,就认为那里存的就是小数至于,你问的问题,是因为计算机关于浮点数的存取,大部分是按照IEEE的规定来存取的C语言中的float类型存取时,最高位为符号位,30-23是指数,22-0是尾数0x404947AE //这是一个float类型0 10000000 10010010100011110101110符号 阶数 尾数阶数,减去偏移量127,得1,表示小数部分偏移1.10010010100011110101110 移动一位 11.0010010100011110101110 大约得十进制 3.144(不晓得,我有没有算错(⊙o⊙)…)至于double 的规定就不太清楚了
4. C语言浮点数的储存方式为何浮点数储存不准确那个图片是什么意思
C语言中,无论是单精度还是双精度在存储中都分为三个部分:
1. 符号位(Sign) : 0代表正,1代表为负
2. 指数位(Exponent)(注:也叫阶码):用于存储科学计数法中的指数数据,并且采用移位存储(注:移码编码表示)
3. 尾数部分(Mantissa):尾数部分
关于不精确是由于十进制小数部分化二进制,常常化不尽。如同无限循环小数,最后有截断误差。
图片中的是float型的变量的存储上的格式。
5. 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。
6. c语言中double和float它们存储时分别占据多大的内存空间
double 中文译为双精度浮点数,一般称双精度数,它在内存中占用8个字节(位、bit)的空间;float 中文译为单精度浮点数,一般就称为浮点数,它在内存中占用4个字节的空间。
7. C语言中浮点数为什么不能准确存储
浮点数,即双精度double型或单精度float型,拿双精度的double来说,定义一个double型的变量,如 double a;那么a在内存中开辟了一个32位的空间来存储变量a,但是你要存储变量a,计算机要将浮点数a用一个定点整数和一个定点小数表述,在对阶码的时候,由于各个计算机CPU的字长不一样,可能造成对阶时产生小数部分丢失,这样造成了存储不准确。建议看看组成原理。
8. C语言浮点型是怎样存储的
C语言中的float类型占用4个字节长,这4个字节分为如下3部分:
1位符号位 8位阶码 23位尾数部分
这23位尾数才真正存储了二进制的有效位,将这23位二进制转换为十进制也就6到7位有效数字。
9. C语言二进制浮点数储存方式
float 单精度说明符,在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。
double 双精度说明符。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
其实记起来非常简单的- -!!
自己编个程序看看~~
void main()
{
float a;
double b;
a=33333.33333;
b=33333.33333333333333;
printf("a=%f\n,b=%f\n",a,b);
}
然后~~~
答案是
a=33333.332131
b=33333.333333
由于a 是单精度浮点型,有效位数只有七位。而整数已占五位,故小数二位后之后均为无效数字。(就是2131那部分)。
b 是双精度型,有效位为十六位。应该显示全部小数,但是!!!!Turbo C 规定小数后最多保留六位,其余部分四舍五入。所以答案是这个。。
这样解释的行吗?打字太累了~~~
10. 关于浮点数在C语言中的存储问题
写c==2.468f就可以。
浮点数常量默认是double型。你直接写2.468会强转型。