4.float 变量与"零值"进行比较
我们知道浮点数在内存中存储,可能会有精度损失(注:这里的损失,不是一味的减少了,还有可能增多,浮点数本身存储的时候,在计算不尽的时候,会“四舍五入”或者其他 策略)
4.1两个浮点数是否可以进行相等比较
从下面的图片代码中可以看出 x=1.0,y=0.1,那么进行 if 表达式判断时 x - 0.9 应该等于 0.1 ,0.1与 y 相等应当打印 1,但却打印了 0 ,这是为什么了?
那我们接下来,来看看打印 x-0.9 和 0.1 打印的究竟是什么?
原来内存中 x - 0.9 并不等于 0.1,而是精度损失了,而 y 也不是0.1,也精度损失了,所以上面代码的才没有打印 1
结论:因为精度损失问题,两个浮点数,绝对不能使用==进行相等比较
4.2那么两个浮点数该如何比较呢?
应该进行范围精度比较
注:fabs是浮点数求绝对值
如何设置精度?
自己用宏定义设置
使用系统精度
1.自己用宏定义设置精度
2.使用系统精度
4.3 float 变量与 0 比较
#include<stdio.h> #include<float.h> #include<math.h> int main() { float x = 0.000000000000001f;//当数值足够小时,会被判断为0 //if (fabs(x) < DBL_EPSILON) if (fabs(x-0) < DBL_EPSILON) { printf("1\n"); } else { printf("0\n"); } return 0; }
5.指针变量与“零值”进行比较
5.1表示0的方法
我们之前学习过 数字0、转义字符 \0、空 NULL,它们也都可以表示0
我们可以转到NULL定义,可以看到其实NULL就是0
5.2指针变量与零比较
6.else 到底与哪个 if 配对呢?
1.这个代码总是让人感觉它与第一个 if 匹配,其实它跟第二个 if 匹配,因为 else 采取的是就近原则,所以这个代码什么也都不打印
#include<stdio.h> int main() { int x = 0; int y = 1; if (10 == x) if (11 == y) printf("hi\n"); else printf("hello\n"); return 0; }
2.这个才是正确的代码风格,一看就知道 else 与哪个 if 匹配
#include<stdio.h> int main() { int x = 0; int y = 1; if (10 == x) { if (11 == y) { printf("hi\n"); } } else { printf("hello\n"); } return 0; }
为什么 不写成 x==10,而写成10 == x?
答:因为这样写可以避免把==写成=,如果不小心写成=,我们知道赋值号的左边必须是变量,所以这属于语法错误,编译器会提示,那要是不小心写成了 x = 10,这就属于运行错误系统不会提示。
由此可知良好的编程风格对编程者是多么重要,养成良好的编程习惯,从你我做起。