float 单精度浮点数在机内占 4 个字节 用 32 位二进制描述。

double 双精度浮点数在机内占 8 个字节 用 64 位二进制描述。

float-and-double-.jpg

浮点数在机内用指数型式表示 分解为:数符 尾数 指数符 指数四部分。

数符占 1 位二进制 表示数的正负。

指数符占 1 位二进制 表示指数的正负。

尾数表示浮点数有效数字 0.xxxxxxx, 但不存开头的 0 和点。

指数存指数的有效数字。

指数占多少位 尾数占多少位 由计算机系统决定。

可能是数符加尾数占 24 位 指数符加指数占 8 位 -- float

数符加尾数占 48 位 指数符加指数占 16 位 -- double

知道了这四部分的占位 按二进制估计大小范围 再换算为十进制 就是你想知道的数值范围。

对编程人员来说 double 和 float 的区别是 double 精度高 有效数字 16 位 float 精度 7 位。但 double 消耗内存是 float 的两倍 double 的运算速度比 float 慢得多 C 语言中数学函数名称 double 和 float 不同 不要写错 能用单精度时不要用双精度(以省内存 加快运算速度)。

float32 6-7 -3.4*10(-38)~3.4*10(38)
double 64 15-16 -1.7*10(-308)~1.7*10(308)
long double 128 18-19 -1.2*10(-4932)~1.2*10(4932)

简单来说 Float 为单精度 内存中占 4 个字节 有效数位是 7 位(因为有正负 所以不是8位) 在我的电脑且 VC++6.0 平台中默认显示是6位有效数字;double为 双精度 占 8 个字节 有效数位是 16 位 但在我的电脑且 VC++6.0 平台中默认显示同样是 6 位有效数字

例子:在 C 和 C++ 中 如下赋值语句:

float a=0.1; 

编译器报错:warning C4305: 'initializing' : truncation from 'const double ' to 'float '

原因:在 C/C++ 中(也不知道是不是就在 VC++ 中这样) 上述语句等号右边 0.1 以为它是个 float 但是编译器却把它认为是个 double(因为小数默认是 double) 所以要报这个 warning,一般改成 0.1f 就没事了。

本人通常的做法 经常使用 double 而不喜欢使用 float。

C 语言和 C# 语言中 对于浮点类型的数据采用单精度类型 float 和双精度类型 double 来存储 float 数据占用 32bit, double 数据占用 64bit, 在声明个变量 float f= 2.25f 的时候 是如何分配内存的呢?如果胡乱分配 那世界岂不是乱套了么 其实不论是 float 还是 double 在存储方式上都是遵从 IEEE 的规范 的 float 遵从的是 IEEE R32.24 ,而 double 遵从的是 R64.53。

无论是单精度还是双精度在存储中都分为三个部分:

  • 符号位(Sign):0 代表正 1 代表为负。
  • 指数位(Exponent):用于存储科学计数法中的指数数据 并且采用移位存储。
  • 尾数部分(Mantissa):尾数部分。

来源地址:https://my.oschina.net/zd370982/blog/724265