您的位置:首页 > 编程语言 > C语言/C++

关于C语言中的一些小细节----浮点数的比较

2018-01-18 19:15 183 查看
今天是第一次写博客,有点小激动,我个人经常看别人的博客,所以就想自己写了,其实以前就想把自己目前所知道的一些C语言经验写了,但是一直都没时间(好吧,其实是直接懒),从今天开始保持写博客的习惯吧,就当做对自己的技术总结(也会写一点生活上的事咯),可能是原创博客,也可能是转载别人的哦 ,希望可以坚持下来,也希望可以帮助到别人,好了,话不多说,进入第一篇博客的正题----关于C语言浮点数的比较
     关于对浮点数的比较还是在写一道学校oj题目的时候的



当然这是一道水题了,我写这道题的思路就是是,S,T,P,三点只需要满足在同一条直线上并且P点到S与T点距离的和等于S点到T点的距离,话不多说,附上代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n,i,j;
scanf("%d",&n);
double Data
[6];
for(i=0; i<n; i++)
{
for(j=0; j<6; j++)
{
scanf("%lf",&Data[i][j]);
}
}
for(i=0; i<n; i++)
{
double a=pow(Data[i][4]-Data[i][0],2)+pow(Data[i][5]-Data[i][1],2);
double b=pow(Data[i][4]-Data[i][2],2)+pow(Data[i][5]-Data[i][3],2);
double c=pow(Data[i][0]-Data[i][2],2)+pow(Data[i][1]-Data[i][3],2);
double k1=fabs((Data[i][3]-Data[i][1])/(Data[i][2]-Data[i][0]));
double k2=fabs((Data[i][5]-Data[i][1])/(Data[i][4]-Data[i][0]));
else if(k1==k2)
{
if(fabs(sqrt(a)+sqrt(b)-sqrt(c))<1e-6)
printf("yes\n");
else
printf("no\n");
}
else
printf("no\n");
}
return 0;
}


开始的时候我比较距离的代码是
    if(sqrt(a)+sqrt(b)==sqrt(c))
                 printf("yes\n");

提交的时候一直错了,我想不明白哪里错了,后来拿到了数据我一步一步调试的时候发现输入数据
0  0  3  3  2  2    的时候输出no,但是很明显这是符合条件的一组数据啊,所以我又去重新测试了一下





如图所示,明明是相等的却输出no
由此可见浮点数的计算是有误差精度的,不要直接比较两数是否相等,应该比较两数的差的绝对值是否足够小,也就是是否小于1e-6(相当于10^-6),小于的话就可以直接看成相等了
哈哈,说了这么多其实就是最后两句话最重要,毕竟第一篇博客,多啰嗦啰嗦,以后就不会这样了,希望可以帮助到正在学习的你(溜了溜了



)
当然如果想要一起探讨计算机技术的可以一起交流交流啊,我目前也是正在精学C语言和java
本人QQ:1363646276

7d34
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: