文章目录
一,什么是浮点数
浮点数是计算机存储小数的一种方式,在C语言中,任何带小数点的数都被编译器解释为浮点数。
顾名思义,浮点数就是小数点可以浮动的数。
要了解浮点数,先回忆下科学计数法,数字3140,可以有如下多种表示方法:
这种表示方法中,小数点是可以移动的,称之为浮点数。
有没有小数点固定的定点数呢?理论上是有的,但是C语言标准中没有定点数的规定。
所以,浮点数是一种用计算机中用科学计数法表示小数的形式
。
所谓“浮点数”就是使用 m * bⁿ 的形式,存储一个数值:
- m是小数部分
- b是基数(通常是2)
- n是指数部分
这种形式是精度和数值范围的一种结合,可以表示非常大或者非常小的数。
二,C语言中的浮点数
在C语言中存在单精度(single precision)和双精度(double precision)两种浮点数类型,分别对应于float
和double
数据类型。
-
单精度浮点数(
float
):这是C语言中的一种基本浮点数类型,通常占用32位(4字节)存储空间。它可以表示大约6到7位十进制数的精度,数值范围大约从-3.40282347E+38到3.40282347E+38。 -
双精度浮点数(
double
):这是C语言中另一种更广泛使用的浮点数类型,占用64位(8字节)存储空间。它提供了更高的精度,大约可以表示15到16位十进制数的精度,数值范围大约从-1.7976931348623157E+308到1.7976931348623157E+308。
1,float
1.1 float的声明
浮点数的类型声明使用float关键字,可以用来声明浮点数变量。
float c = 10.5;
上面示例中,变量c的就是浮点数类型。
1.2 float的存储格式
在C语言中,float类型的浮点数遵循IEEE 754标准,占用4个字节(32位),其由三部分构成:
- 1位符号位(S):表示数的正负。
- 8位指数位(E):使用偏置表示法存储指数,偏置值为127。
- 23位尾数位(M):存储小数部分的实际二进制位,实际表示时假设在最前面有一个隐含的1(即尾数的精度实际上是24位)。
1.3 float的精度和范围
23位尾数位决定了float类型的精度
,其能表示小数点后有6~7位小数的十进制数字。
float类型的指数范围为十进制的-38到38。
float类型数值范围用十进制表示,大约从-3.40282347E+38
到3.40282347E+38
。
2,double
2.1 double变量的声明
双精度浮点数的类型声明使用double关键字,可以用来声明浮点数变量。
double c = 10.5;
上面示例中,变量c的就是浮点数double类型。
2.2 double的存储格式
在C语言中,double类型的浮点数遵循IEEE 754标准,占用8个字节(64位),其由三部分构成:
- 1位符号位(S):表示数的正负。
- 11位指数位(E):使用偏置表示法存储指数,偏置值为1023。
- 52位尾数位(M):存储小数部分的实际二进制位,实际表示时假设在最前面有一个隐含的1(即尾数的精度实际上是53位)。
2.3 double的精度和范围
52尾数位决定了float类型的精度
,其能表示小数点后有15~16位小数的十进制数字。
double类型的指数范围为十进制的-308到308。
double类型数值范围用十进制表示,大约从-1.7976931348623157E+308
到1.7976931348623157E+308
。
2.4 long double
C语言还提供了一个long double类型,其精度和范围依编译器而定,可能比double更高,通常占用16个字节,但并非所有系统上都有显著的差别。
3,0.2 + 0.1 ≠ 0.3
注意,由于存在精度限制,浮点数只是一个近似值,它的计算是不精确的,比如 C 语言里面0.1 + 0.2并不等于0.3,而是有一个很小的误差。
if (0.1 + 0.2 == 0.3) // false
关于这个问题更详细的解释,可以参考https://blog.csdn.net/epitomizelu/article/details/139115670
4,优先使用double
在实际编程中,选择使用float还是double取决于对精度的需求和存储空间的考虑。
double类型因其更高的精度而被推荐为默认的浮点数类型,除非有特别的内存限制或性能考虑。
三,C语言中的浮点数表示法
C 语言允许使用科学计数法表示浮点数,使用字母e来分隔小数部分和指数部分。
double x = 123.456e+3; // 123.456 x 10^3
// 等同于
double x = 123.456e3;
上面示例中,e后面如果是加号+,加号可以省略。
注意,科学计数法里面e的前后,不能存在空格。
另外,科学计数法的小数部分如果是0.x或x.0的形式,那么0可以省略。
0.3E6
// 等同于
.3E6
3.0E6
// 等同于
3.E6