如何将 asin 结果保存在一个 short 变量中?

How to save the asin result in a short variable?

假设我有两个函数 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!知道我在这里做错了什么吗?

(y-x)/0xFFFF 总是给出 0.

假设 short 是 16 位。 (y-x)没有办法超过0xFFFF0xFFFFint类型。所以它总是计算为 0.

试试这个:

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

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

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

这里又出现了一个问题。 asin returns 是 [-pi/2,+pi/2] 范围内的双精度数,因此需要使用浮点类型来保持其精度,否则弧度角将被转换为 [-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