C keeles π (pi) kasutamine | Täpne programmeerimisjuhend

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 standardraamatukogu math.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 saab math.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.
C keeles nõutakse nende olukordade arvutustes suurt täpsust, seetõttu on oluline mõista õigesti, kuidas π-d käsitleda.

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: floatdoublelong 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.
Allolev kood on näide π käsitlemisest erinevate ujukomaarvu tüüpidega.
#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.