前言
计算几何,虽然不少题都是板子来套,但我们应深知,“借”来的板子远不如自己消化理解后打的板子拓展性强。没有学不会的算法,只有不想学的ACMer。最近比赛接连遇到不少较为基础的计算几何,因为没有接触这方面因此错失AC,如今比赛、题目、安排较多,因此先简单花一两周入个门,以后再打算深入时,有了之前的基础,就不会那么难
———————————————————————————2020.3.5 22:20pm
常用常量
1.π=3.1415926…
因为反余弦函数的取值范围正好是0-π,那么π最精确的求法是用反余弦函数计算
const double PI=acos(-1.0);
2.浮点数精度eps
因为浮点数在计算过程会有精度损失,因此浮点数比较时必须做减法再和eps比较
const double eps=1e-8;
3.浮点整数最大值
因为double类型最多可以存308位,故其也可以保存一个很大的整数
const double INF=1e300;
浮点误差
浮点数比较
不能直接比较,有两种解决办法
1.误差判别法
double d1,d2;
if((d1-d2)<eps){
...
}
我们直接定义inline的比较函数,后面比较浮点数不用写if之间调用函数
inline int dcmp(double d){
if(fabs(d)<eps) return 0;
return d>0?1:-1;
}
inline int cmp(double x,double y){ //x>y返回1,x=y返回0,x<y返回-1
return dcmp(x-y);
}
2.化浮为整
在不溢出的情况下,不断乘以10直到无小数位,计算后再转化为浮点数
浮点数输出
因为计算机存储时可能存了负零,要防止计算机输出负零
注意事项
- 尽量少用三角函数、除法、开方、求幂、取对数运算
- 在不溢出的情况下将除式比较转化为乘式比较
- 涉及多个数的乘除时尽量一次性乘再一次性除
- 在使用除法、开根号、和三角函数的时候,要考虑由浮点误差运算产生的代价
常用math函数
double ceil(double x); //向上取整
double floor(double x); //向下取整
double round(double x,int pos=0); //四舍五入
double sqrt(double x); //开根号
double fabs(double x) //求绝对值