Атан (х) дает мне неправильные значения? - PullRequest
3 голосов
/ 06 декабря 2011

Я получил эту функцию в своем коде:

-(void)printAngle
{
    int width = p2_t.x-cp1_t.x;
    int height = p2_t.y-cp1_t.y;
    if (width != 0) {
        CCLOG(@"%i * %i", width, height);
        CCLOG(@"%f", (float)atan(height/width)*(180/M_PI));
    }
}

Вот фрагмент из вывода:

2011-12-06 20:46:52.074 x[12392:c503] 24 * 13
2011-12-06 20:46:52.074 x[12392:c503] 0.000000
2011-12-06 20:46:52.108 x[12392:c503] 25 * 15
2011-12-06 20:46:52.108 x[12392:c503] 0.000000

Это означает, что arctan (13/24) в градусах равно 0. Что неверно. Так почему я получаю 0? Что-то с типами я делаю не так?

Он получает правильные углы:

2011-12-06 20:51:11.956 x[12436:c503] 12 * 129
2011-12-06 20:51:11.957 x[12436:c503] 84.289404
2011-12-06 20:51:11.989 x[12436:c503] 10 * 132
2011-12-06 20:51:11.990 x[12436:c503] 85.601292

1 Ответ

12 голосов
/ 06 декабря 2011

Вы используете целочисленную математику и ожидаете результат с плавающей запятой. Это не сработает. Замените width и height на float, и вы получите ожидаемые результаты.

Если вы не знаете, в C выполнение деления на целые числа дает интегральный результат. Таким образом, оценка 13/24 дает 0 вместо 0.541666667. Приведя одну из переменных к (float) перед выполнением деления, или просто используя float для начала, вы получите ожидаемое число с плавающей точкой.

...