目次
1. Sissejuhatus
C keelt kasutatakse endiselt laialdaselt süsteemi arenduses ja sisseehitatud süsteemides, kus nõutakse tõhusat ja madala taseme programmeerimist. Eriti matemaatilistes arvutustes on konstant π (pii) üks vältimatuid konstandi. C keeles on selle pii väärtuse korrektseks käsitlemiseks mitu meetodit. Selles artiklis käsitleme kõike alates C keeles pii kasutamise põhimõtetest kuni tegelike koodinäidete välja. Eriti selgitame, kuidas kasutada standardraamatukogumath.h
sisalduvat M_PI
, kuidas defineerida omaenda, ning ka Leibnizi valemit pii arvutamiseks. Sellega saavad C keelt kasutavad programmeerijad piiga tõhusalt töötada.2. C keeles π kasutamise alused
π (pi) ülevaade
π on matemaatiline konstant, mis saadakse, kui jagada ringi ümbermõõt diameetriga. Selle väärtus on ligikaudu 3.14159… ja see on lõpmatu kümnendmurd, mängides olulist rolli geomeetrilistes arvutustes ja füüsikalistes simulatsioonides. C keeles saabmath.h
teeki kasutades seda π-d lihtsalt kasutada.C keeles kasutusstsenaariumid
C keeles on π kasutamise vajadus järgmistes olukordades:- Geomeetrilised arvutused: näiteks ringi ja sfääri pindala või ruumala arvutamisel on alati π vajalik.
- Füüsikalised simulatsioonid: eriti pendli liikumise ja ringliikumise puhul on füüsikaliste nähtuste arvutamisel π vajalik.
- Graafika: 3D graafikas ja mängude arendamisel kasutatakse π-d ka ringide ja kõverate joonistamisel.
3. M_PI kasutamine
math.h
määratletud M_PI
C keele standardraamatukogu math.h
sisaldab mitmesuguseid matemaatilisi konstandeid ja funktsioone. Nende seas kasutatakse sageli M_PI
konstandina, mis esindab pii väärtust. Allpool on lihtne näide, kuidas M_PI
abil arvutada ringi pindala.#include <stdio.h>
#include <math.h> // math.h kaasamine
int main() {
double radius = 5.0; // raadiusega 5 ring
double area = M_PI * radius * radius; // pindala arvutamine
// väljasta arvutustulemus
printf("Raadiusega %.2f ringi pindala: %.5f\n", radius, area);
return 0;
}
Selles koodis kasutatakse M_PI
abil raadiusega 5 ringi pindala arvutamiseks. Väljund on järgmine.Raadiusega 5.00 ringi pindala: 78.53982
M_PI
kasutamise korral, kui see ei ole saadaval, lahendus
Mõnes keskkonnas, eriti Visual Studio sarnastes kompilaatorites, ei pruugi math.h
sisaldada M_PI
definitsiooni. Sel juhul saab _USE_MATH_DEFINES
määratleda eeltöötleja juhisena, et M_PI
oleks kasutatav.#define _USE_MATH_DEFINES
#include <math.h>
int main() {
printf("Pi väärtus: %f\n", M_PI); // pi väärtuse väljund
}
4. M_PI kasutamisega seotud probleemide lahendused
Ise defineerimise meetod
M_PI
Keskkondades, kus M_PI
ei ole toetatud, on võimalik ise määrata π väärtus. Allpool on näide, kuidas #define
abil määrata π väärtus.#include <stdio.h>
// Defineeri π ise
#define MY_PI 3.14159265358979323846
int main() {
double radius = 5.0;
double area = MY_PI * radius * radius; // Kasutades defineeritud π, arvutatakse pindala
printf("Käsitsi defineeritud π abil arvutatud ringi pindala: %.5f
", area);
return 0;
}
Kui kasutad seda meetodit, saad igas keskkonnas π-d käsitseda, mis võimaldab luua kõrge ülekantavusega programme.
5. Leibnizi valemi abil π arvutamine
Leibnizi valem
Leibnizi valem on matemaatiline valem π arvutamiseks. See on esitatud järgmise valemiga.π / 4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - ...
Selle valemi abil saate C keeles ise π arvutava programmi luua.#include <stdio.h>
void 円周率計算(unsigned long 反復回数) {
double pi = 0.0;
int 符号 = 1;
for (unsigned long i = 0; i < 反復回数; i++) {
pi += (double)符号 / (2 * i + 1); // arvutamine valemi järgi
符号 *= -1; // muuda märk
}
printf("Arvutatud π: %.15f\n", pi * 4); // väljasta tulemus
}
int main() {
円周率計算(1000000); // arvuta π 1 000 000 kordusega
return 0;
}
Selles koodis kasutatakse Leibnizi valemit π arvutamiseks. Korduste arvu suurendamisel saadakse täpsem π väärtus. Näiteks miljon korda kordamisel saadakse järgmine tulemus.Arvutatud π: 3.141592653590
6. Ujukomaarvud ja π täpsus
Ujukomaarvu täpsus
Arvutis π käsitsemisel tuleb pöörata tähelepanu ujukomaarvu täpsusele. C keeles pakutakse kolme ujukomaarvu tüüpi:float
、double
、long double
. Igaühe täpsus on erinev ning mida suurem on arv, seda rohkem tekivad vead.float
tüüp: 32 bitti, umbes 7-kohaline täpsus.double
tüüp: 64 bitti, umbes 15-kohaline täpsus.long double
tüüp: tavaliselt üle 80 bitti, vähemalt 19-kohaline täpsus.
#include <stdio.h>
#define M_PI 3.14159265358979323846
int main() {
float f_pi = (float)M_PI; // float tüüp
double d_pi = M_PI; // double tüüp
long double ld_pi = (long double)M_PI; // long double tüüp
// Väljasta täpsuse erinevused
printf("float tüüp π: %.7f
", f_pi);
printf("double tüüp π: %.15f
", d_pi);
printf("long double tüüp π: %.19Lf
", ld_pi);
return 0;
}
Arvutusvigade kogunemine
Korduvates arvutusi võib viga koguneda sõltuvalt ujukomaarvu täpsusest. See on eriti probleemiks suurtes füüsikalistes simulatsioonides ja finantsarvutustes, kus kordusi on palju. Järgnevas näites näidatakse viga, kui 0.1 liita miljon korda.#include <stdio.h>
int main() {
double sum = 0.0;
for (int i = 0; i < 1000000; i++) {
sum += 0.1; // korduv liitmine
}
printf("Oodatav tulemus: 100000.0
");
printf("Tegelik tulemus: %.15f
", sum); // tulemuse kuvamine
return 0;
}
Selles koodis on oodatav tulemus 100000.0, kuid ujukomaarvu viga muudab tulemuse veidi erinevaks. Nii nagu viga võib koguneda ja mõjutada tulemust.7. Tegeliku programmi näited
M_PI
kasutamisega pi arvutamise programm
Järgmisena tutvustame konkreetset programmi, mis kasutab M_PI
. Siin näitame, kuidas M_PI
abil arvutada ringi pindala.#include <stdio.h>
#include <math.h>
int main() {
double radius = 10.0; // raadius
double area = M_PI * radius * radius; // arvuta ringi pindala
// väljasta tulemus
printf("Raadiusega %.2f, ringi pindala on %.5f.\n", radius, area);
return 0;
}
Selles programmis arvutatakse raadiusega 10 ringi pindala ja kuvatakse tulemus. M_PI
kasutamisega on võimalik hõlpsasti viidata pi väärtusele.Leibnizi valemi kasutamisega π arvutamise programm
Järgmisena rakendame programmis Leibnizi valemi abil π arvutamise meetodi. Nagu eespool mainitud, on Leibnizi valem matemaatiline meetod π ligikaudse väärtuse leidmiseks.#include <stdio.h>
void calc_pi(unsigned long iterations) {
double pi = 0.0;
int sign = 1; // positiivne või negatiivne märk
for (unsigned long i = 0; i < iterations; i++) {
pi += sign / (2.0 * i + 1); // Leibnizi valemi põhine arvutus
sign *= -1; // märgi pööramine
}
printf("Iteratsioonide arv %lu korral pi väärtus: %.15f\n", iterations, pi * 4); // väljasta tulemus
}
int main() {
calc_pi(1000000); // arvuta pi 1000000 iteratsiooniga
return 0;
}
Selles programmis tehakse funktsioonis calc_pi()
määratud arv iteratsioone, et leida π ligikaudne väärtus. Miljon korda iteratsiooni korral lähenevad pi väärtus väga kõrgele täpsusele.8. Kokkuvõte
Selles artiklis tutvustasime C keeles π (pi) kasutamise erinevaid meetodeid.math.h
-s sisalduva M_PI
-i kasutamise meetodit, keskkonnast sõltumatult omaenda definitsiooni ning Leibnizi valemi abil π arvutamise meetodit selgitati üksikasjalikult. Lisaks käsitlesime ujukomaarvude täpsuse tähelepanekuid ja korduvate arvutuste käigus tekkiva vea kogunemist ning näitasime konkreetseid rakendusviise tegelike programmi näidete kaudu. Selle tulemusena loodetavasti süvendasite oma arusaama, kuidas C keeles täpset arvutust tehes luua kõrgtäpsusega programme. Jätkates programmeerimise arvutusoskuste lihvimist, on soovitatav õppida ka teiste matemaatiliste konstantide ja funktsioonide kasutamist.