保持模块化距离的标志

时间:2016-05-12 02:08:10

标签: c++ c algorithm math mod

我正在寻找一个模数运算符mqseries,以便:

  • Mod(a,b,m)
  • Mod(2,6,7)=-3

也就是说,操作员避开2到6之间的4跳路径,而是通过长度为3的路径绕圈。如果从Mod(6,2,7)=3离开并且转到{,答案会保留路径方向{1}}。

以下代码计算了这一点,但几乎肯定有更好的方法。

a

3 个答案:

答案 0 :(得分:1)

您可以使用标准模数函数处理负数的方式,使其完成决定进入哪个方向的工作:

#include <cmath>
double ModDist(double s, double d, double m) {
    return std::fmod((d - s) * 2, m) + s - d;
}

答案 1 :(得分:1)

数学库函数余数,顾名思义,在第一个参数除以第二个参数时返回余数。与fmod不同,它返回一个带符号的结果,实际上,余数(a,d)是绝对值的最小数r,这样a-r是d的整数倍。 你想要的是这适用于b-a,即:

double  ModDist( double a, double b, double m)
{ return remainder( b-a, m);
}

答案 2 :(得分:0)

如果您的直接距离小于距离的一半,则通过另一种方式不会做得更好。相反,如果它大于距离的一半,你可以通过改变方向做得更好。

这假定为0<=src,dest<=m

double ModDist(double src, double dest, double m){
  double directDistance = dest - src;
  if(abs(directDistance)<m/2)
    return directDistance;
  return -(m - abs(directDistance))*sgn(directDistance);
}