C-keeles „%lf” kasutamine: Topelttäpsusega ujukomaarvude õige vormindamine

1. Sissejuhatus

C-keeles kasutatakse vormindusmääreid arvude ja stringide kuvamiseks või sisestamiseks. Eriti ujukomaarvudega töötades on oluline mõista selliste määrangute nagu „%f” ja „%lf” erinevusi, et kirjutada täpset programmi. Selles artiklis keskendume topelttäpsusega ujukomaarvudele (double-tüüp) vastava „%lf” kasutamisele, selgitades selle kasutamist printf ja scanf funktsioonides ning erinevusi teiste määrangutega.

2. Mis on vormindusmäärang?

Vormindusmäärang on sümbol, mida kasutatakse C-keeles andmete kuvamise või sisestamise vormingu määramiseks. Õige määrangu kasutamine sobiva andmetüübiga võimaldab täpset andmete sisendit ja väljundit. Vaatame esmalt levinumaid vormindusmääreid ja nende vastavaid andmetüüpe.

Levinumad vormindusmäärajad ja vastavad andmetüübid

VormindusmäärangVastav andmetüüp
%dint-tüüp (täisarv)
%ffloat-tüüp (ühe täpsusega ujukomaarv)
%lfdouble-tüüp (topelttäpsusega ujukomaarv)
%Lflong double-tüüp (laiendatud topelttäpsusega ujukomaarv)
侍エンジニア塾

3. „%lf” kasutamine printf-funktsioonis

C-keele printf funktsiooni kasutatakse andmete kuvamiseks määratud vormingus. Kui kuvada topelttäpsusega ujukomaarvu printf abil, võib kasutada nii „%f” kui ka „%lf”, kuid nende kasutamisel on väike erinevus.

Erinevus „%lf” ja „%f” vahel printf-is

printf funktsioonis saab nii %f kui ka %lf kasutada double-tüübi väljastamiseks. Seda seetõttu, et printf teisendab ujukomaarvude argumendid automaatselt double-tüübiks. Seetõttu on tavaks topelttäpsusega arvude väljastamisel kasutada „%f”.

Näide

#include <stdio.h>

int main() {
    double num = 3.14159;
    printf("%f\n", num);  // Väljund: 3.141590
    printf("%lf\n", num); // Väljund: 3.141590
    return 0;
}

Nagu näites näha, annab mõlemad määrangud sama tulemuse, kuid printf-is on standardiks %f kasutamine double-tüübi puhul.

4. „%lf” kasutamine scanf-funktsioonis

scanf funktsioon salvestab sisestatud andmed määratud tüüpi muutujasse. scanf-is peab määrang vastama muutuja andmetüübile ning siin tuleb eristada „%f” ja „%lf” kasutamist.

Erinevus „%lf” ja „%f” vahel scanf-is

  • „%f”: kasutatakse siis, kui sisend salvestatakse float-tüüpi muutujasse.
  • „%lf”: kasutatakse siis, kui sisend salvestatakse double-tüüpi muutujasse. double-tüübi puhul peab alati kasutama %lf.

Näide

#include <stdio.h>

int main() {
    double num;
    printf("Sisesta arv: ");
    scanf("%lf", &num); // Salvestab sisendi double-tüüpi muutujasse
    printf("Sisestatud arv: %f\n", num);
    return 0;
}

Seega tuleb scanf-is topelttäpsusega ujukomaarvu sisestamiseks kasutada „%lf”. Kui kasutada ekslikult „%f”, võib programm käituda ootamatult.

5. Tähelepanekud „%lf” kasutamisel

„%lf” kasutamisel on eriti oluline, et scanf-funktsioonis vastaks määrang muutuja tüübile. Kui need ei ühti, võib tekkida ootamatu käitumine või viga.

Levinud vead ja õige kasutus

Vale näide

Allpool olevas koodis kasutatakse %lf float-tüübi puhul, mis ei tööta korrektselt.

#include <stdio.h>

int main() {
    float num;
    printf("Sisesta arv: ");
    scanf("%lf", &num); // Vale määrang
    return 0;
}

Õige näide

Allpool kasutatakse õigesti „%lf” double-tüübi puhul.

#include <stdio.h>

int main() {
    double num;
    printf("Sisesta arv: ");
    scanf("%lf", &num); // Õige määrang
    return 0;
}

scanf-i kasutamisel peab alati tagama, et määrang vastaks muutuja andmetüübile.

6. Erinevused teiste vormindusmäärajatega

Lisaks „%lf”-ile on kasulik tunda ka teisi vormindusmääreid, et neid vajaduse järgi kasutada.

Peamised vormindusmäärajad ja nende kasutus

  • %f: kasutatakse float-tüübi puhul (ja printf-is ka double-tüübi puhul)
  • %Lf: kasutatakse long double-tüübi puhul
  • %e / %E: kasutatakse teadusliku märgenduse vormingus väljundiks

Näide ja erinevuste selgitus

#include <stdio.h>

int main() {
    long double num_long_double = 3.14159265358979323846L;
    printf("long double tüübi väljund: %Lf\n", num_long_double); // long double määrang
    printf("Teaduslik märgendus: %e\n", num_long_double);  // Teaduslik vorming
    return 0;
}

Õige määrangu kasutamine vastavalt andmetüübile tagab väljundi täpsuse.

7. Kokkuvõte

Selgitasime C-keeles topelttäpsusega ujukomaarvu määrangut „%lf”. Järgnevaid punkte silmas pidades on võimalik kirjutada vähemate vigadega koodi.

  • printf funktsioon: topelttäpsusega arvude jaoks võib kasutada „%f” või „%lf”, kuid tavaks on kasutada „%f”.
  • scanf funktsioon: double-tüübi puhul tuleb kasutada „%lf”, float-tüübi puhul „%f”. Määrang ja andmetüüp peavad kattuma.
  • Tähelepanek: vale määrangu kasutamine võib eriti scanf-is põhjustada ootamatut käitumist, seega on oluline, et määrang ja tüüp ühtiksid.