浮点型变量
浮点型变量分为单精度(float)型,双精度(double)型和长双精度(long double)型,三类。
浮点数精度丢失
比如我们赋值给a=1.23456789e10,加10后,应该得到的值是1.234567891e10
#include<stdio.h>
int main() {
float a,b;
a = 1.23456789e10;
b = a + 10;
printf("%f",b);
return 0;
}
但结果却如下图所示
我们称这种现象为精度丢失,因为float能够表示的有效数字为7位,最多只能保证1.234567e10的准确性,想要使结果正确,可以把float改成double。
类型 | 位数 | 数值范围 | 有效数字 |
---|---|---|---|
float | 32 | 10^-37~10^38 | 6~7位 |
double | 64 | 10^-307~10^308 | 15~16位 |
long double | 128 | 10^-4931~10^4932 | 18~19位 |
浮点数的判断
直接上代码
#include<stdio.h>
int main() {
float f;
f = 1.456;
if (f == 1.456) {
printf("f is 1.456\n");
}
else {
printf("f is not 1.456\n");
}
return 0;
}
结果当然是“f is not 1.456”
Why?
浮点数是不能直接判断相等的!!
我们看调试代码:
f赋的值并不是1.456
所以浮点数不能直接判断相等
可以用减法来判断 f - 1.456 >= -1e6 && f - 1.456 <= 1e-6
#include<stdio.h>
int main() {
float f;
f = 1.456;
if (f - 1.456 >= -1e6 && f - 1.456 <= 1e-6) {
printf("f is 1.456\n");
}
else {
printf("f is not 1.456\n");
}
return 0;
}
ps:
本人编程小白一个,第一天在c站上发文章,写的不好,欢迎各位提出意见。