在c中使用sin函数获取错误的值

时间:2015-03-17 14:21:14

标签: c math

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

#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?

2 个答案:

答案 0 :(得分:3)

您将intdouble混淆。您的参数angle不能是整数,因为它与M_PI / 180相乘,后者将四舍五入为零。角度时间0为零。

您可以将角度保持为整数,但是当与M_PI / 180.0相乘时,将结果存储在float或double变量中。而且你必须调整你的printf语句来打印浮点数而不是小数。

答案 1 :(得分:2)

您乘以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°的正弦范围。