关于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
关于对浮点数的比较还是在写一道学校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
相关文章推荐
- 关于c语言static的一些细节
- 关于c语言的深入剖析——一些小细节
- 关于C++的一些细节[二:简单变量]
- 关于单链表的一些面试题-进阶篇(C语言实现)
- javascript中浮点数相加的一些细节
- 一些关于AWS的小细节(1)
- 关于Android内存、性能优化的一些细节
- 关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正
- 比较小的一些知识点一(关于菜单的创建和资源文件的创建)
- 关于多线程的一些细节
- 【react学习】关于react框架使用的一些细节要点的思考
- 关于使用webView的一些细节问题
- 关于Ubuntu下apt的一些用法及和yum的比较
- c语言的一些小细节
- 关于linux的一些比较不错的链接
- C语言关于内存的一些描述
- 关于C语言中static,const,volatile与typedef的一些总结
- C语言中一些比较基础而又重要的知识
- 关于微信小程序开发的一些细节
- 关于Apache/Tomcat/JBOSS/Neginx/lighttpd/Jetty等一些常见服务器的区别比较和理解