我试图将角度包裹在 [-pi, pi] 范围内。我尝试了以下代码的许多变体,这应该是一个非常简单的任务,但是,如果角度已经是 pi、-pi 或 0,它会将其输出为负数(因此 pi = -pi、-pi = pi, 0 = -0).
这是我目前拥有的代码:
static double wrapAngle( double angle){
while (angle < -M_PI) {
angle += 2.0 * M_PI;
}
while (angle > M_PI) {
angle -= 2.0 * M_PI;
}
return angle;
}
它正确地包装了除 -M_PI、M_PI 和 0 之外的所有内容。它给了我负数。
您的代码在小于 -pi 时递增 2pi,在大于 pi 时递减 2pi。通常人们会期望它以 +-2pi 的步长重复收敛到 [-pi, pi] 区间。
然而,您观察到结果在幅度上似乎是正确的,但在符号上却不正确。这样想:如果你已经有 0,即使这样它也会反转符号,而你的算法显然不会改变它。
因此,您在其他地方有一个错误,在您未在此处共享的部分代码中,并且该错误反转了符号,而您的算法看起来大部分都很好,唯一担心的是累积舍入错误,这可以通过执行以下操作来帮助:单次计算(首先通过除法找出有多少个周期,然后将所述周期数乘以 +-2pi),而不是按 +-2pi 的步长移动。