2021SC@SDUSC 山东大学软件学院软件工程应用与实践
1、mrflsh3.c结构
mrflsh3.c的总体结构如下,,主要实现了facos()、fasin()、fatan()、fcos()、fsin()、ftan()、norm()、tan1() 几个在miracl开源库中比较重要的函数,这一次的博客就是读一下这函数的功能。
2、源代码
static int norm(_MIPD_ int type,flash y)
{ /* convert y to first quadrant angle *
* and return sign of result */
int s;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return 0;
s=PLUS;
if (size(y)<0)
{
negify(y,y);
if (type!=COS) s=(-s);
}
fpi(_MIPP_ mr_mip->pi);
fpmul(_MIPP_ mr_mip->pi,1,2,mr_mip->w8);
if (fcomp(_MIPP_ y,mr_mip->w8)<=0) return s;
fpmul(_MIPP_ mr_mip->pi,2,1,mr_mip->w8);
if (fcomp(_MIPP_ y,mr_mip->w8)>0)
{ /* reduce mod 2.pi */
fdiv(_MIPP_ y,mr_mip->w8,mr_mip->w9);
ftrunc(_MIPP_ mr_mip->w9,mr_mip->w9,mr_mip->w9);
fmul(_MIPP_ mr_mip->w9,mr_mip->w8,mr_mip->w9);
fsub(_MIPP_ y,mr_mip->w9,y);
}
if (fcomp(_MIPP_ y,mr_mip->pi)>0)
{ /* if greater than pi */
fsub(_MIPP_ y,mr_mip->pi,y);
if (type!=TAN) s=(-s);
}
fpmul(_MIPP_ mr_mip->pi,1,2,mr_mip->w8);
if (fcomp(_MIPP_ y,mr_mip->w8)>0)
{ /* if greater than pi/2 */
fsub(_MIPP_ mr_mip->pi,y,y);
if (type!=SIN) s=(-s);
}
return s;
}
norm()方法地主要作用就是将输入的角度y转换成第一象限的角度,并且返回结果的符号。首先观察y是否小于0,是的话调用negify方法获得y的相反数。再调用fpi方法将圆周率p.赋值给mr_mip->pi,调用fpmul方法使得mr_mip->pi*1/2赋值给mr_mip->w8,此时调用fcomp方法看y是否小于等于mr_mip->w8,是的话返回1。再次调用fpmul方法使得mr_mip->pi*2/1赋值给mr_mip->w8。调用调用fcomp方法看y是否大于mr_mip->w8