1.浮点类型
- float:
- 字长:32,
- 范围:±(1.20*10^-38 ~ 3.40*10^38), 0, ±inf, nan,
- 有效数字:7
- 输入(scanf):%f
- 输出(printf):%f,%e
- double:
- 字长:64,
- 范围:±(2.2*10^-308 ~ 1.79*10^308),0, ±inf, nan,
- 有效数字:7
- 输入(scanf):%lf
- 输出(printf):%f,%e
2. 科学计数法
#include<stdio.h>
int main()
{
double ff = 1234.56789;
printf("%e,%f\n", ff, ff);// 1.234568e+003,1234.567890
printf("%E,%f\n", ff, ff);// 1.234568E+003,1234.567890
return 0;
}
3.输出精度
在%.nf中,n是指定的输出几位小数,输出结果是四舍五入的
#include<stdio.h>
int main()
{
double ff = 1E-10;
printf("%E,ff=%.16f\n", ff, ff); // 1.000000E-010,ff=0.0000000001000000
float i = -0.0049;
printf("%.3f\n", i); // -0.005
printf("%.30f\n", i); // -0.004900000058114528700000000000
i = 0.00049;
printf("%.3f\n", i); // 0.000
return 0;
}
4.超过范围的浮点数
printf:
- 超过范围的浮点数(±∞):inf,无穷大 (infinity 的缩写)
- 不存在的浮点数:nan 。IND是Windows上的说法,NaN是Linux上的说法,”IND”是 indeterminate 的缩写,而”nan”是 not a number 的缩写
如果遇到 1.#INF / inf,就检查是否发生了运算结果溢出除零,而遇到 1.#IND / nan,就检查是否发生了非法的运算
#include<stdio.h>
int main()
{
printf("%f\n", 12.0/0.0); // 1.#INF00
printf("%f\n", -12.0/0.0); // -1.#INF00
printf("%f\n", 0.0/0.0); // -1.#IND00,表示发生了除0错误
printf("%d\n", 12/0); // 会出警告:[Warning] division by zero [-Wdiv-by-zero]
return 0;
}
5. 浮点运算的精度
#include<stdio.h>
int main()
{
float a, b, c;
a = 1.345f;
b = 1.123f;
c = a + b;
if(c == 2.468){
printf("相等\n");
} else {
printf("不相等! c=%.10f, 或%f\n", c, c);// 不相等! c=2.4679999352, 或2.468000
}
return 0;
}
带小数点的变量是double,不是float
float需要用 f 或 F 后缀来表明身份
6.选择浮点类型
- 没有特殊需要,用double
- 现代CPU能直接对double做硬件运算,性能不会比float差,在64位的机器上,数据存储的速度也不比float慢
浮点数在计算时,是由专门的硬件实现的
整数是以二进制的形式存在于计算机内部的,浮点数不是
浮点数的编码的数字,两个浮点数在计算机内部 不能直接用二进制的方式进程运算,需要专门的硬件支持。