2013-02-11 120 views
-1

我需要增加/减少phi角度值d无限。 (d可以是负值或正值)。“无限”增加/减少角度

“无限”意味着循环变化可能会持续很长时间。但为了避免溢出,需要依赖sin()和cos()的周期性来“降低”值。 (< => 2 * pi < => 2 * n * pi)。

它如何在函数中实现? (例如double stepAngle(双phi,double d))。

+0

模运算可能会有所帮助 – 2013-02-11 16:52:09

+0

@thiton不应该使用的功课标签:http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated – 2013-02-11 16:55:46

+0

@尼克斯C .:谢谢你的提示。 – thiton 2013-02-11 16:57:21

回答

1

一种方法是重新归一化至所需范围:

while (d > 2*pi) d -= 2*pi; 
while (d < 0) d += 2*pi; 

这将是有效的,只要d不是非常远的0..2 * PI的范围之外。

2

标准库函数只是“做正确的事”的值> 2 * PI,你不必做任何事情:

int main() { 
    double pi = 3.14159265359; 
    double x = 2.5; 
    cout << sin(x) << endl; 
    cout << sin(x + 2*pi) << endl; 
    cout << sin(x - 8*pi) << endl; 
} 

这些都将打印相同的值;试试看。

+0

我知道。但是,如果一个角度的值“无限”地增加,迟早会出现溢出。所以我问这个问题。 – 2013-02-12 12:47:06

+0

也随着距离0越来越远,由于用于尾数的位数是有限的,所以存在精度损失。如果你有一个3000000000000这样的数字并且加上0.001(使用IEEE双精度),结果仍然是3000000000000。如果你增加0.01,那么这个改变可以用可用的精度表示。 – 2013-02-12 17:35:45

2

这可能与fmod相当容易。

double stepAngle(double phi, double d) 
{ 
    double newPhi = phi += fmod(2*pi, d); 
    if(newPhi > 2*pi) 
    { 
     newPhi -= 2*pi; 
    } 
    if(newPhi < 0) 
    { 
     newPhi += 2*pi; 
    } 

    return newPhi;