float 单精度浮点数在机内占 4 个字节,用 32 位二进制描述。
double 双精度浮点数在机内占 8 个字节,用 64 位二进制描述。
浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。
数符占 1 位二进制,表示数的正负。
指数符占 1 位二进制,表示指数的正负。
尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的 0 和点。
指数存指数的有效数字。
指数占多少位,尾数占多少位,由计算机系统决定。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字。简介:浮点型数据类型,FLOAT 数据类型用于存储单精度浮点数或双精度浮点数。浮点数使用 IEEE。
可能是数符加尾数占 24 位,指数符加指数占 8 位 -- float。
数符加尾数占 48 位,指数符加指数占 16 位 -- double。
知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。
float对应的是6位小数,如果输出语句不做额外定义就输出带有6位小数。float精度是2^23,能保证6位。double精度是2^52,能保证15位。但是默认float和double都只能显示6位,再多需要#include <iomanip>,然后在输出语句之前插。
对编程人员来说,double 和 float 的区别是 double 精度高,有效数字 16 位,float 精度 7 位。但 double 消耗内存是 float 的两倍,double 的运算速度比 float 慢得多,C 语言中数学函数名称 double 和 float 不同,不要写错,能用单精度时不要用双精度(以省内存,float占多少位,加快运算速度)。,
例子:在 C 和 C++ 中,如下赋值语句:
float a=0.1;
原因: 在 C/C++ 中(也不知道是不是就在 VC++ 中这样),上述语句等号右边 0.1,我们以为它是个 float,但是编译器却把它认为是个 double(因为小数默认是 double),所以要报这个 warning,一般改成 0.1f 就没事了。
float类型默认保留小数点后6位,若是要输出一位或者其他位数,可以按照以下形式进行输出:printf("%.(这里输入要输出的位数)f",x);如输出一位:printf("%.1f",x);
本人通常的做法,经常使用 double,而不喜欢使用 float。
C 语言和 C# 语言中,对于浮点类型的数据采用单精度类型 float 和双精度类型 double 来存储,float 数据占用 32bit,double 数据占用 64bit,我们在
对于float32(单精度)来说,表示尾数的为23位,除去全部为0的情况以外,最小为2-23,约等于1.19*10-7,所以float小数部分只能精确到后面6位,加上小数点前的一位,即有效数字为7位。同理float64(单精度)的尾数部分。
无论是单精度还是双精度在存储中都分为三个部分:
符号位(Sign):0 代表正,1 代表为负。
指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储。
尾数部分(Mantissa):尾数部分。
← C/C++ 获取键盘事件
Java 接口和多态 →
1 篇笔记
TRDSF
429***435367@qq.com
C++ 中 float 与 double 类型的精度区别
double 精度高,有效数字 15-16 位,float 精度低,有效数字 6-7位,但是 double 消耗的内存是 float 的两倍,运算速度比 float 慢得多,建议能用 float 保证精度的就用 float,少用 double。
float的有效位确实是7为,float另外还有规定,即,其有效数字最多为6位。y=45.000000 这个输出很有迷惑性,但是这个数中小数点后的有效位数只有5个,因为45占了2位(总共7位有效位)当你的输入改为x=123 y=45.
include <iomanip>using namespace std;int main(){ float a=12.2579; double b=12.2579; 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;}