继续坚持,或些许孤独
导言:
众所周知我们的数据有好多种类型,其中double类型和float类型用于表示小数类型。那么它们会有什么特殊之处呢?接下来就让我们来分析一下:
目录
double类型和float类型的区别(1):
这两种类型都用于储存浮点数,但是两者所占的内存空间大小却不一样,double占8个字节;float占4个字节。这就好比我们的int类型和long int 类型两者都用于储存整形但是两者所占的字节却不一样。
double类型和float类型储存与int类型的不同:
这里我们以float类型为例:
浮点数在机内用指数型式表示,分解为:
数符,尾数,指数符,指数四部分:
V==(-1)^S*M*2^E !!!!!!
- S(占一个比特位)表示符号位的数字
- M(23比特位)是数据位的2进制科学计数表示(和10进制的表示一样)
- E(占8个比特位)表示科学计数的次方
首先我们要明白数据在电脑中是以2进制的形式进行存储的,这里可以看看我的另一篇文章:
数据在计算机中的存储http://t.csdnimg.cn/CdLIpdouble,float,int 这三种类型都是带符号的。所以还是那样我们的最后一个2进制位表示符号位。其中:“1”表示负数,“0”表示正数。
接下来重点来了:
我们的int 类型:int 有4个字节,32比特位。其数据位从2^0次方,也就是从1开始,31个比特位表示数据的大小,第32个比特位用于表示数据符号。
那么模仿int 类型。如果要储存小数,我们可以将数据的存储从2^-1(0.5)或2^-2(0.25)开始就可以达到表示出小数的效果,但是这样的话将会造成数据的不精确存储。
这里我们double类型和float类型的区别,就再一次出现了:
double类型和float类型的区别(2):
float
类型 通常是单精度浮点数,它可以表示大约6到7位有效数字,约为7个十进制位。double
类型 通常是双精度浮点数,它可以表示大约15到16位有效数字,约为16个十进制-
#include <iostream> #include <iomanip> using namespace std; int main() { float a=12.257902012398877; double b=12.257902012398877; const float PI=3.1415926; // 常量定义 cout<<setprecision(15)<<a<<endl; // 只有6-7位有效数字,后面的就不精确 cout<<setprecision(15)<<b<<endl; // 有15-16位有效数字,所以完全正确 cout<<setprecision(15)<<PI<<endl; return 0; }
简单来讲就是double比float存储更加精确,但是:double所占的内存空间是float的两倍,使用double类型会使计算机的运行速度减慢。
在C语言中double和float名称是有很大区别的我们不能将两者混写,在数据精度满足时尽量选用float类型进行存储。
练习:
int main()
{
float i = 3.1415f;
int* pi = (int*)&i;
printf("%d\n", *pi);
int x = 9;
float* p = (float*)&x;
printf("%f\n",*p );
}
赠言:
人见多了苦难,也就不再想遗憾