在 c 中使用 sin 函数获取错误值
gettin wrong values using sin function in c
我想在这里计算一个角度的 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?
您混淆了 int
和 double
。您的参数 angle
不能是整数,因为它会与 M_PI/180 相乘,这将四舍五入为零。角度乘以 0 为零。
您可以将角度保持为整数,但是当与 M_PI/180.0 相乘时,将结果存储在 float 或 double 变量中。并且您必须调整 printf 语句以打印浮点数而不是小数。
你乘以 65536
但它应该是 65535
.
此外,您不允许正弦为负(y
和 z
计算都产生负正弦)。应该是
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° 正弦的范围。
我想在这里计算一个角度的 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?
您混淆了 int
和 double
。您的参数 angle
不能是整数,因为它会与 M_PI/180 相乘,这将四舍五入为零。角度乘以 0 为零。
您可以将角度保持为整数,但是当与 M_PI/180.0 相乘时,将结果存储在 float 或 double 变量中。并且您必须调整 printf 语句以打印浮点数而不是小数。
你乘以 65536
但它应该是 65535
.
此外,您不允许正弦为负(y
和 z
计算都产生负正弦)。应该是
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° 正弦的范围。