计算几何(一)——入门须知

前言

计算几何,虽然不少题都是板子来套,但我们应深知,“借”来的板子远不如自己消化理解后打的板子拓展性强。没有学不会的算法,只有不想学的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)    //求绝对值
发布了128 篇原创文章 · 获赞 7 · 访问量 5260

猜你喜欢

转载自blog.csdn.net/qq_44691917/article/details/104685793