如何保存asin导致一个短变量?

时间:2015-03-05 16:50:54

标签: c

假设我有两个函数f1f2,我希望在一个短变量中得到相变:

short  x=15615, y=24045;
short angle =0;

angle = asin((y-x)/0xFFFF);
angle = angle * 180/M_PI;

printf(" the winkel is : %d \r\n" , ( short)( angle));

无论我改变什么,我都只得到0!知道我在这里做错了什么吗?

2 个答案:

答案 0 :(得分:3)

(y-x)/ 0xFFFF总是给0。

假设short是16位。 (y-x)无法超过0xFFFF0xFFFF属于int类型。所以它总是评估为0。

试试这个:

((float)(y-x))/0xFFFF

答案 1 :(得分:2)

y和x是short s,因此它们的差异将在[-65535,65535]范围内。将(y-x)除以int将导致整数除法,其中几乎总是返回0,因为|y-x| <= 0xFFFF。您需要通过将/运算符的任一侧转换为float或double

来进行浮点除法
angle = asin((y-x)/65535.0); // or angle = asin((y-x)/(float)0xFFFF);

这里还出现了另一个问题。 asin在[-pi / 2,+ pi / 2]范围内返回一个double,因此您需要使用浮点类型来保持其精度,否则将将弧度角度转换为范围内的int [-1,1]

double rad_angle;
short angle; // no need to initialize it here

rad_angle = asin((y-x)/65535.0);
angle = rad_angle * 180/M_PI;

printf("The winkel is %d\n", angle); // no need to use `'\r'` here because `'\n'` will automatically be converted if needed
相关问题