我想在这里计算一个角度的正弦值:

#define M_PI    3.14159265358979

void calculate( int angle) {
    unsigned short x = 0, y= 0 , z=0;  I need the
    angle *=  M_PI/180;
    x =(short) (sin(angle)* 65535);
    y =(short) (sin(angle+(120* (M_PI/180))) *65535);
    z =(short) (sin(angle - (120* (M_PI/180))) *65535);
    printf("X angle  value =  %d \n", x);
    printf("Y angle value = %d  \n",y);
    printf("Z angle value = %d \n",z);
}


我得到的是

Z angle value = 7299
X angle  value =  55145
Y angle value = 3091


我真的不明白我做错了什么吗?

我期待中:
x = 65535
y = Z = 65535/2 = 32767
但事实并非如此!
角度值是90°

更新

我已经将代码更改为:
现在角度是浮动的

#define M_PI    3.14159265358979

unsigned short x = 0, y= 0, z=0;
angle *= M_PI/180.0;
x = (unsigned short) (sin(angle)* 65536);
y = (unsigned short) (sin(angle+(120* (M_PI/180.))) *65536);
z = (unsigned short) (sin(angle + (240* (M_PI/180.0))) *65536);


现在,我得到了X的正确值,但Y,Z的却不是0。

最佳答案

您要乘以65536,但应为65535

此外,您也不允许正弦为负(yz计算都产生负正弦)。它应该是

x =(unsigned short) (32768.0 + sin(angle)* 32767.0);


但我不明白您为什么不使用签名的short

x =(short) (sin(angle)* 32767);


更新

如果您需要16位绝对值,如下所示:

x =(unsigned short) (fabs(sin(angle))* 65535);


请注意65535而不是65536,对于90°正弦而言,这将超出范围。

10-06 15:21