1. Sissejuhatus
C-keelt kasutatakse laialdaselt süsteemiarenduses ja manussüsteemides, kus on nõutav kiire töötlus. Eriti trigonometrilisi funktsioone kasutatakse sageli matemaatiliste arvutuste puhul, näiteks füüsikasimulatsioonides, graafika renderdamisel ja signaalitöötluses.
Selles artiklis selgitame üksikasjalikult C-keele trigonometriliste funktsioonide põhilist kasutamist ja rakendusnäiteid. Algajad saavad tugeva aluse ning kesktaseme ja edasijõudnud kasutajad saavad rakendusnäidete kaudu täiendada oma praktilisi oskusi.
Mida sellest artiklist õpid
- C-keele trigonometriliste funktsioonide põhiline kasutamine
- Iga funktsiooni tööpõhimõte ja kasutusvaldkond
- Rakendusnäited ja jõudluse optimeerimise põhipunktid
Järgnevalt selgitame konkreetseid funktsioone ja toome näiteid koodiga, seega loe kindlasti lõpuni.
2. C-keele trigonometriliste funktsioonide loend ja funktsioonide selgitus
C-keeles trigonometriliste funktsioonide kasutamiseks tuleb kaasata standardraamatukogu <math.h>
. See raamatukogu sisaldab palju funktsioone trigonometriliste arvutuste tegemiseks. Allpool on need funktsioonid jaotatud vastavalt otstarbele.
Põhifunktsioonid
sin(double x)
– tagastab antud nurga siini radiaanides.cos(double x)
– tagastab antud nurga koosini radiaanides.tan(double x)
– tagastab antud nurga tangensi radiaanides.
Arcsin-, arccos- ja arctan-funktsioonid
asin(double x)
– arvutab antud väärtuse arkusiini (tulemus radiaanides).acos(double x)
– arvutab antud väärtuse arkukoosini.atan(double x)
– arvutab antud väärtuse arkutangensi.
Eriomadustega funktsioonid
atan2(double y, double x)
– tagastab koordinaadi (x, y) nurga radiaanides. See funktsioon võimaldab eraldi käsitleda lugejat ja nimetajat, vältides nulliga jagamise vigu.
Abifunktsioonid
hypot(double x, double y)
– arvutab Pythagorase teoreemi abil punkti (x, y) kauguse origo punktist.
Märkus: nurgaühikud
Kõik C-keele trigonometrilised funktsioonid töötavad radiaanides. Kui sisend on kraadides, tuleb see enne arvutamist teisendada radiaanideks.
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
int main() {
double degree = 45.0;
double radian = degree * (PI / 180.0); // kraadidest radiaanideks teisendamine
printf("sin(45 kraadi) = %fn", sin(radian));
return 0;
}
See kood arvutab 45 kraadi siini ja kuvab tulemuse. Pööra tähelepanu kraadide ja radiaanide erinevusele.

3. Trigonometriliste funktsioonide põhiline kasutamine
Siin selgitame, kuidas C-keeles trigonometrilisi funktsioone kasutada, koos konkreetsete koodinäidetega.
Siini-, koosini- ja tangensifunktsioonide kasutusnäide
Koodinäide: sin(), cos(), tan() põhiline kasutamine
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
int main() {
double angle = 45.0; // kraadides
double radian = angle * (PI / 180.0); // teisendus radiaanideks
printf("sin(%.2f kraadi) = %.6fn", angle, sin(radian));
printf("cos(%.2f kraadi) = %.6fn", angle, cos(radian));
printf("tan(%.2f kraadi) = %.6fn", angle, tan(radian));
return 0;
}
Väljundnäide:
sin(45.00 kraadi) = 0.707107
cos(45.00 kraadi) = 0.707107
tan(45.00 kraadi) = 1.000000
Arcsin-, arccos- ja arctan-funktsioonide kasutusnäide
Need funktsioonid on kasulikud nurga leidmiseks antud väärtusest.
Koodinäide: asin(), acos(), atan() põhiline kasutamine
#include <stdio.h>
#include <math.h>
int main() {
double value = 0.5; // sisendväärtus
printf("asin(%.2f) = %.6f (radiaanides)n", value, asin(value));
printf("acos(%.2f) = %.6f (radiaanides)n", value, acos(value));
printf("atan(%.2f) = %.6f (radiaanides)n", value, atan(value));
return 0;
}
Väljundnäide:
asin(0.50) = 0.523599 (radiaanid)
acos(0.50) = 1.047198 (radiaanid)
atan(0.50) = 0.463648 (radiaanid)
atan2() funktsiooni kasutusnäide
atan2()
funktsioon on mugav nurga arvutamiseks ristkoordinaatide (x, y) põhjal.
Koodinäide: nurga arvutamine funktsiooniga atan2()
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
int main() {
double x = 1.0;
double y = 1.0;
double angle = atan2(y, x) * (180.0 / PI); // teisendus kraadidesse
printf("Punkti (%.1f, %.1f) nurk = %.2f kraadin", x, y, angle);
return 0;
}
Väljundnäide:
Punkti (1.0, 1.0) nurk = 45.00 kraadi
Selles koodis arvutatakse punktist (1.0, 1.0) moodustuv nurk kraadides, kasutades atan2()
funktsiooni. See meetod aitab vältida nulliga jagamise vigu ja on seetõttu ohutu kasutada.
4. Rakendusnäited
Järgnevalt vaatame konkreetseid trigonometriliste funktsioonide kasutusvõimalusi.
Pööramisteisendus graafikas
Trigonometrilisi funktsioone kasutatakse sageli 2D- ja 3D-graafikas koordinaatide pööramiseks.
Koodinäide: 2D-koordinaatide pööramine
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
void rotate_point(double x, double y, double angle) {
double radian = angle * (PI / 180.0);
double x_new = x * cos(radian) - y * sin(radian);
double y_new = x * sin(radian) + y * cos(radian);
printf("Pärast pööramist: (%.2f, %.2f)n", x_new, y_new);
}
int main() {
double x = 1.0, y = 0.0;
double angle = 45.0;
printf("Algkoordinaadid: (%.2f, %.2f)n", x, y);
rotate_point(x, y, angle);
return 0;
}
Väljundnäide:
Algkoordinaadid: (1.00, 0.00)
Pärast pööramist: (0.71, 0.71)
See programm pöörab punkti (1.0, 0.0) 45 kraadi ja arvutab uued koordinaadid.
Kasutusnäide füüsikasimulatsioonis
Näide: pendli liikumise simulatsioon
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793
int main() {
double length = 1.0; // pendli pikkus (m)
double gravity = 9.81; // gravitatsioonikiirendus (m/s^2)
double time = 0.0; // aeg
double period = 2 * PI * sqrt(length / gravity); // periood
printf("Aeg (s) Nurk (rad)n");
for (int i = 0; i <= 10; i++) {
double angle = 0.1 * cos(2 * PI * time / period); // väike amplituud
printf("%.2f %.4fn", time, angle);
time += 0.1;
}
return 0;
}
Väljundnäide:
Aeg (s) Nurk (rad)
0.00 0.1000
0.10 0.0998
0.20 0.0993
0.30 0.0985
See kood simuleerib pendli liikumist ja väljastab nurga muutumise ajas.
5. Arvutustäpsus ja jõudluse optimeerimine
C-keeles trigonometriliste funktsioonide kasutamisel on oluline arvestada arvutustäpsuse ja jõudluse optimeerimisega. Selles jaotises selgitame, kuidas saavutada tasakaal täpsuse ja kiiruse vahel.
Märkused täpsuse kohta
Ümardamisvigade mõju
Ujukomaarvutustes võivad tekkida ümardamisvead. Eriti väga väikeste või väga suurte väärtuste puhul võivad vead akumuleeruda.
Näide: ümardamisvea esinemine
#include <stdio.h>
#include <math.h>
int main() {
double angle = 90.0; // kraadides
double radian = angle * (M_PI / 180.0); // teisendus radiaanideks
double result = cos(radian);
printf("cos(90 kraadi) = %.15fn", result); // teoreetiliselt peaks olema 0.000000000000000
return 0;
}
Väljundnäide:
cos(90 kraadi) = 0.000000000000001
Lahendus:
- Kasutage ligikaudset võrdlust: näiteks
fabs(result) < 1e-10
võimaldab arvestada arvutusvigadega.
Kiirarvutusalgoritmide kasutamine
Kiiruse suurendamise tehnikad
Trigonometriliste funktsioonide arvutamine on protsessorile koormav, seetõttu võib jõudlust nõudvates rakendustes kasutada ligikaudseid valemeid või spetsiaalseid algoritme.
Koodinäide: kiire sin() funktsioon (Taylor’i rida)
double fast_sin(double x) {
double x2 = x * x;
return x * (1.0 - x2 / 6.0 + x2 * x2 / 120.0); // Taylor'i arenduse põhjal ligikaudne arvutus
}
See meetod vähendab veidi täpsust, kuid suurendab arvutuskiirust.
Jõudlustesti tegemine
Kuidas jõudlust mõõta
Jõudlust saab mõõta, kasutades standardseid ajamõõtmise funktsioone.
Koodinäide: täitmisaegade mõõtmine
#include <stdio.h>
#include <math.h>
#include <time.h>
double fast_sin(double x) {
double x2 = x * x;
return x * (1.0 - x2 / 6.0 + x2 * x2 / 120.0);
}
int main() {
clock_t start, end;
double result;
start = clock(); // algusaeg
for (int i = 0; i < 1000000; i++) {
result = sin(1.0);
}
end = clock(); // lõppaeg
printf("Tavalise sin() täitmisaeg: %f sekunditn", (double)(end - start) / CLOCKS_PER_SEC);
start = clock();
for (int i = 0; i < 1000000; i++) {
result = fast_sin(1.0);
}
end = clock();
printf("Kiire sin() täitmisaeg: %f sekunditn", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
Väljundnäide:
Tavalise sin() täitmisaeg: 0.030000 sekundit
Kiire sin() täitmisaeg: 0.010000 sekundit
Näites võrreldakse standardse ja kiire funktsiooni täitmisaega. Vastavalt rakenduse vajadustele saab valida sobiva meetodi.

6. Tähelepanekud ja parimad tavad
Trigonometrilisi funktsioone kasutades tuleks järgida järgmisi soovitusi.
1. Nurgamõõtühikute haldamine
- Probleem: kraadide ja radiaanide segamine võib põhjustada vigu.
- Lahendus: lisa muutujate või funktsioonide nimedesse ühiku märge.
Näide: angle_deg
või angle_rad
.
2. Vigade käsitlemine
Kui trigonometrilise funktsiooni sisend on vale, võib tulemus olla NaN
(mittearv). Sellisel juhul tuleb seda õigesti käsitleda.
Koodinäide: NaN kontroll
#include <stdio.h>
#include <math.h>
int main() {
double value = 2.0; // asin() jaoks väljaspool lubatud vahemikku -1 <= x <= 1
double result = asin(value);
if (isnan(result)) {
printf("Viga: sisendväärtus on vigane.n");
} else {
printf("Tulemus: %.6fn", result);
}
return 0;
}
Väljundnäide:
Viga: sisendväärtus on vigane.
7. Kokkuvõte
Selles artiklis vaatasime läbi C-keele trigonometriliste funktsioonide põhitõed ja rakendused, samuti täpsuse ja jõudluse optimeerimise tehnikad.
Õppisime:
- Põhiline kasutus ja koodinäited trigonometriliste funktsioonide jaoks
- Rakendusnäited nagu graafika pööramine ja füüsikasimulatsioonid
- Täpsuse ja jõudluse optimeerimise tehnikad
Järgmised sammud:
- Õpi kasutama teisi matemaatikafunktsioone (eksponentsiaal- ja logaritmfunktsioonid)
- Süvene keerukamatesse numbrilise analüüsi algoritmidesse
C-keele trigonometrilised funktsioonid on võimsad tööriistad, mida saab rakendada paljudes valdkondades. Kasuta selles artiklis õpitut oma projektides!