PDA

Prikaži potpunu verziju : Problem sa funkcijama u C-u


NEWSWEETTOFFEE
11.8.2012, 14:00
Zdavo, forumaši

Vi ste mi trenutno najbliži izvor pomoći, pa ću Vam postaviti još jedno pitanje.

Skoro sam počeo da učim C jezik i koristim Code::Blocks editor. Primetio sam da mi trigonometrijske funkcije šalju pogrešne rezultate (npr.: sin(90)=0.89).
Interesuje me zašto je to tako i koliko bi moglo da smeta pri komplikovanijem programiranju?

Unapred hvala!

chaami
11.8.2012, 14:15
Sinus od 90 i jeste 0.89 ali to ti je u radianima.
Sinus od Pi/2 je 1.

Neutrino
11.8.2012, 14:39
Sinus od 90 i jeste 0.89 ali to ti je u radianima.
Sinus od Pi/2 je 1.
Samo ću da dodam na odgovor da ne bude zabune oko prve rečenice šta je tačno u radijanima.

Broj pod sinusom (tj. bilo kojom trigonometrijskom funkcijom koja zahteva ugao kao argument) u C-u je u radijanima a rezultat trignometrijske funkcije je neimenovani broj (nema jedinicu).

sin(90) se dakle prevodi kao "sinus od 90 radijana" a pošto je veza između radijana i stepeni (stepeni) = (radijana) * 180 / Pi dobija se da sin(90) preveden u stepene u stvari znači "sinus od 5156.62 stepeni" :)

NEWSWEETTOFFEE
11.8.2012, 18:04
Hvala, ljudi. Možda sam trebao toga i sam da se setim.:)
A može li se promeniti pa da trigonometrijske funkcije u C jeziku uzimaju kao argumente brojeve koji označavaju broj stepeni?

EclipsE
11.8.2012, 18:27
double mymath(double (*funcptr)(double), double arg) {
return funcptr(arg / 180 * 3.1415926535897932384626433832795);
}

// ...
printf("%lf", mymath(sin, 90));

Neutrino
11.8.2012, 18:49
math.h (http://pubs.opengroup.org/onlinepubs/009695399/basedefs/math.h.html) ima već svoju implementaciju Pi konstante kojoj može da se pristupi sa M_PI pa nema potrebe da se koristi eksplicitno navođenje njene vrednosti (3.1415...)

voodoo_
11.8.2012, 19:00
A možeš i seljačkim makro define-om

#define MYSIN(x) sin(x / 180 * M_PI)

Velika slova su tu čisto jer je konvencija da se makroi pišu velikim slovima (da bi se na prvi pogled znalo da je makro a ne "prava" funkcija sa pravim argumentima i pravim telom funkcije).

EclipsE
11.8.2012, 19:39
math.h (http://pubs.opengroup.org/onlinepubs/009695399/basedefs/math.h.html) ima već svoju implementaciju Pi konstante kojoj može da se pristupi sa M_PI pa nema potrebe da se koristi eksplicitno navođenje njene vrednosti (3.1415...)

Hmm, ja izguglao ali nisam našao ništa... c noob and google noob :p

M.Silenus
11.8.2012, 22:01
Samo jedna mala napomena: M_PI nije deo ANSI C standarda. Ako želiš da koristiš ANSI C bez GNU ekstenzija (-ansi gcc opcija), nećeš imati M_PI.

U to, slučaju, jednostavno definišeš svoj M_PI (ili kako god već hoćeš da ga zoveš).

Geomaster
16.8.2012, 1:17
Da se nadovežem, ako ti treba najveća preciznost, ne moraš da hardkoduješ, možeš samo da definišeš recimo

const double PI = 2.0 * asin(1.0);