atan (x) geeft me verkeerde waarden?

Ik heb deze functie in mijn code:

-(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));
    }
}

Hier volgt een fragment uit de uitvoer:

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

Dat betekent dat arctan (13/24) in graden 0 is. Wat niet correct is. Dus waarom krijg ik 0? Is het iets met typen dat ik verkeerd doe?

Het krijgt een aantal goede hoeken:

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
3
Trouwens, dit heeft niets met Obj-C te maken. Uw probleem is eigenlijk gewoon een pure C-probleem verpakt in een ObjC-methode.
toegevoegd de auteur Kevin Ballard, de bron

1 antwoord

U gebruikt wiskunde op gehele getallen en verwacht een resultaat met een drijvende komma. Dit zal niet werken. Wijzig in plaats daarvan width en height om float te zijn en u zou de verwachte resultaten moeten krijgen.

In het geval dat u zich niet bewust bent, in C, levert het doen van een verdeling met gehele getallen een integraal resultaat op. Dus het evalueren van 13/24 is het produceren van 0 in plaats van 0.541666667 . Door een van de variabelen in (zweven) te zetten voordat u de deling uitvoert, of gewoon zwevend te gebruiken, krijgt u het drijvende-kommagetal dat u verwacht.

12
toegevoegd
Natuurlijk wist ik dat! Dankje
toegevoegd de auteur Jonathan Azulay, de bron
+1 voor correct antwoord. Ook, als alles wat je verwacht een float is (in plaats van een dubbele), waarom dan niet met atanf ()?
toegevoegd de auteur Till, de bron