Limbajul c si C++ abc-doar


Valoarea returnata este egala cu valoarea absoluta a numarului



Yüklə 4,6 Mb.
səhifə27/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   23   24   25   26   27   28   29   30   ...   55

Valoarea returnata este egala cu valoarea absoluta a numarului.

EXEMPLU: #include

#include

#include

#include

double z,y;

main()

{

randomize();

for (y=0;y<20;y++)

{

x=(random(7000)/2.77)-(random(9000)/7.33);

printf("nr.aleator= %lf val.absoluta= %lf \n\n",x,fabs(x));

sleep(1);

}}

Versiunea C++ include si functia fabsl() care este similara dar opereaza

si returneaza numere de tip long double.

SINTAXA GENERALA este: long double fabsl(long double x);
FUNCTIA floor() si floorl()

-rotunjeste numarul prin scaderea zecimalelor

SINTAXA GENERALA este: double floor(double x);

Functia rotunjeste valoarea x la cel mai mare intreg care este mai mic

decat x (stabileste pragul inferior intreg al valorii).

Accepta si returneaza numere de tip double(+-1.7E308)

Versiunea C++ accepta si functia floorl() care opereaza cu numere long

double.SINTAXA GENERALA este: long double floorl(long double x);


-190- [ math.h - fmod() si frexp() ]

EXEMPLU: #include

#include

#include

#include

double x,y;

main()

{

randomize();

for (y=0;y<20;y++)

{ x=(random(5000)/3.14)-(random(6000)/5.77);

printf("nr. aleator= %lf pragul inferior= %lf \n",x,floor(x));

sleep(1);

}}

Observati modul de actiune atat pentru valorile pozitive cat si pentru

cele negative.
FUNCTIA fmod si fmodl()

-calculeaza x modul y (adica restul impartirii lui x prin y)

SINTAXA GENERALA este: double fmod(double x,double y);

Functia accepta si returneaza numere de tip double.

Ecuatia pentru operatia de extragere a modulului poate fi scrisa si sub

forma generala: x=ay+f unde a este un numar intreg iar 0

functia returneaza valoarea pentru f (restul impartirii).

In cazul in care valoarea lui y este zero,functia returneaza zero.

Valoarea returnata pentru rest este un numar float(in virgula mobila).

EXEMPLU: #include

#include

#include

#include

double x,y,z;

main()

{

randomize();

for (y=0;y<20;y++)

{ x=(random(3000)/1.33)-(random(1000));

z=random(7000)/5.66;

printf("x=%lf z=%lf modul(rest) din x/z=%lf\n\n",x,z,fmod(x,z));

sleep(3);

}}

Versiunea C++ include si functia fmodl() care este similara dar accepta

si returneaza numere de tip long double(+- 1.2E4932).
FUNCTIA frexp() si frexpl()

-descompune un numar (double) in mantisa si exponent

SINTAXA GENERALA este: double frexp(double x,int *exponent);

Orice numar real poate fi exprimat ca produs dintre o putere a bazei 2 si

un alt numar fractionar denumit mantisa printr-o ecuatie cu forma generala

x=m*2^n unde m este mantisa iar n este exponentul bazei.

Functia frexp() calculeaza mantisa si arhiveaza in pointerul *exponent

valoarea puterii lui 2 pentru care se verifica ecuatia x=m*2^n.Practic

functia calculeaza si arhiveaza atat mantisa cat si exponentul bazei.


-191- [ math.h - hypot() ]

Valoarea returnata pentru mantisa va fi un numar de tip double cuprins

intre 0,5 si 1 iar valoarea exponentului va fi un numar de tip int.

EXEMPLU: #include

#include

#include

#include

double x,y,z;

int expo;

main()

{

randomize();

for (x=0;x<20;x++)

{ y=random(31000)/2.13;

z=frexp(y,&expo);

printf("Numarul este:%lf \n",y);

printf("Exponentul este:%d \n",expo);

printf("Mantisa este:%lf \n",z);

printf("deci:%lf*2^%d=%lf \n\n",z,expo,y);

sleep(3);

}}

Versiunea C++ include si functia frexpl() care opereaza si returneaza

numere de tip long double.Sintaxa generala este:

long double frexpl(long double x,int *exponent);

Pentru manipularea mesajelor de eroare returnate in cazul unor valori

situate in afara domeniului de reprezentare se pot utiliza functiile

_matherr() si respectiv _matherrl().

Operatia inversa de calcul al numarului din mantisa si exponent se

poate realiza cu ajutorul functiei ldexp() si ldexpl().
FUNCTIA hypot() si hypotl()

-calculeaza ipotenuza unui triunghi dreptunghic

SINTAXA GENERALA este: double hypot(double x,double y);

Practic functia calculeaza valoarea lui z=sqr(x^2+y^2),adica radical din

suma patratelor celor doua catete.Ecuatia de calcul este identica cu cea

pentru calculul ipotenuzei unui triunghi dreptunghic(de la care a primit

numele functiei).

Functia returneaza rezultatul ecuatiei sau daca se obtine o valoare in

afara domeniului de reprezentare,returneaza HUGE_VAL(cea mai mare valoare

reprezentabila=1.7E308) si seteaza errno la valoarea ERANGE(out of range).

EXEMPLU: #include

#include

double x,y,z;

main()

{ printf("Introduceti valoarea pentru prima cateta: ");

scanf("%lf",&x);

printf("Introduceti valoarea pentru a doua cateta: ");

scanf("%lf",&y);

z=hypot(x,y);

printf("\n Ipotenuza este: %lf \n\n",z);

printf("Apasati orice tasta: \n\n");

getch(); }


-192- [ math.h - labs(),ldexp(),log() ]

Versiunea C++ include si functia hypotl() care opereaza si returneaza

numere de tip long double(+-1,2E4932).SINTAXA GENERALA este:

long double hypotl(long double x,long double y);

Pentru manipularea erorilor generate de domeniul de reprezentare se

pot utiliza functiile _matherr() si _matherrl()si variabila errno.
FUNCTIA labs()

-returneaza valoarea absoluta a unui numar long int

SINTAXA GENERALA este: long labs(long int x);

Functia este similara cu abs() dar opereaza cu numere de tip long int

(-2147483548 la 2147483647 ) si este descrisa pe larg in stdlib.h (vezi).

Practic returneaza numarul de tip long int,exclusiv cu semn pozitiv.
FUNCTIA ldexp() si ldexpl()

-calculeaza un numar din mantisa si exponent (nr=x*2^exp)

SINTAXA GENERALA este: double ldexp(double x,int exp);

Functia calculeaza valoarea numarului din mantisa si exponentul sau.Este

inversa functiei frexp().Opereaza si returneaza valori de tip double.

EXEMPLU: #include

#include

#include

#include

double x,y;

int x;

main()

{

randomize();

for (z=1;z<15;z++)

{ y=random(1000)/5.37;

x=ldexp(y,z);

printf("Mantisa este: %lf \n",y);

printf("Exponentul este: %d \n",z);

printf("Numarul rezultat este: %lf \n",x);

printf("adica: %lf*2^%d=%lf \n\n",y,z,x);

sleep(4);

}}

Versiunea C++ include si functia ldexpl() care opereaza si returneaza

numere de tip long double.SINTAXA GENERALA este:

long double ldexpl(long double x,int x);

Erorile domeniului de reprezentare se arhiveaza in variabila errno si pot

fi manevrate cu functiile _matherr() si _matherrl() (pentru depanare).
FUNCTIA log() si logl()

-calculeaza logartimul natural din x

SINTAXA GENERALA este: double log(double x);

Functia calculeaza valoarea logaritmului natural al numarului x.Opereaza

si returneaza numere de tip double(+-1.7E308).Functia poate fi apelata si

pentru numere complexe sau bcd(binary-coded decimals).

Versiunea C++ include si functia logl() care opereaza si returneaza

numere de tip long double(-+1.2E4932).SINTAXA GENERALA este:

long double logl(long double x);


-193- [ math.h - log10() si matherr() ]

Daca argumentu; functiei (x) este mai mic decat zero (Exemplu log(-1) ),

functia seteaza variabila errno la EDOM (Domain error) iar daca x este

zero,functia returneaza HUGE_VAL si seteaza errno la EDOM.Rutinele de

manevrare a erorilor pot fi modificate cu marterr().

EXEMPLU: #include

#include

#include

double x;

int y;

main()

{

for (y=1;y<20;y++)

{ printf("numarul este: %d \n",y);

printf("e^%d este: %lf\n",exp(y));

printf("log(%d) este: %lf \n ",y,log(y));

printf("iar log(%lf) este: %lf \n\n",exp(y),log(exp(y)));

sleep(5);

}}
FUNCTIA log10() si log10l()

-calculeaza logaritm din x in baza 10

SINTAXA GENERALA este: double log10(double x);

Functia este identica cu log() dar calculeaza logaritmul in baza 10 in

locul celui natural.In rest indicatiile tehnice sunt ca si pentru log().

Functia poate fi apelata si pentru numere complexe sau BCD.

Versiunea C++ include si functia log10l() care opereaza si returneaza

numere de tip long double.SINTAXA GENERALA este:

long double log10l(long double x);

EXEMPLU: #include

#include

#include

double x;

int y,z;

main()

{

for (y=1;y<12;y++)

{ z=y*10;

printf("numarul este: %d \n",z);

printf("log10 din %d este: %lf \n",z,log10(z));

sleep(3);

}}
FUNCTIA matherr() si _matherrl()

-este o functie de manevrare a erorilor(poate fi modificata de utilizator)

SINTAXA GENERALA este: int matherr(struct exception *e);

unde: exception este un tip de data de tip structura definit special in

math.h iar *e este pointerul spre structura de tip exception care contine

informatiile pentru manevrarea erorilor matematice.

Functia matherr() este implicita si este apelata de catre program ori

de cate ori una dintre functiile din biblioteca math.h genereaza o eroare

matematica (domeniul de reprezentare etc.).


-194- [ math.h - matherr() ]

Utilizatorul poate inlocui functia implicita cu o functie adaptata nece-

sitatilor definite de utilizator pentru manevrarea erorilor matematice.

Functia este foarte utila mai ales in cursul etapei de depanare a erorilor

de tip matematic,mai ales pentru cele referitoare la domeniul de reprezen-

tare a diferitelor tipuri de numere.Functia nu depisteaza exceptiile date

de numerele in virgula fixa(Exemplu: impartirea prin zero a numerelor de

tip float).

Functiile definite de utilizator pentru manevrarea erorilor inlocuiesc

functia implicita si pot fi concepute astfel incat sa corecteze un anumit

tip de erori (scontate).Functiile de acest gen trebuie sa returneze zero

in caz ca nu reusesc sa corecteze eroarea intalnita sau o valoare nonzero

in caz ca eroarea a fost corectata.In situatiile in care functia returnea-

za o valoare diferita de zero,nu se va mai afisa nici un mesaj de eroare

iar variabila errno va ramane nemodificata.In caz ca functia returneaza

zero,se afiseaza mesajul de eroare si se seteaza variabila errno.

Structura implicita pentru exception este de tipul"

struct exception {

int type;

char *name;

double arg1,arg2,retval;

};

unde : type -este tipul de eroare matematica

name -este pointerul spre sirul ce arhiveaza numele functiei

care a generat eroarea matematica

arg1 -sunt argumentele transferate functiei care a generat

arg2 eroarea (daca functia are un singur argument=arg1)

retval -este valoarea implicita (poate fi modificata)

Tipul de eroare matematica returnat de type este arhivat tot in math.h

in variabila _mexcep care accepta urmatoarele constante:

DOMAIN Argumentul este in afara domeniului (Ex: log(-1) )

SIGN Argumentul a generat o exceptie (Ex: pow(0,-2) )

OVERFLOW Argumentul genereaza o valoare > DBL_MAX( Ex: exp(1000))

UNDERFLOW Argumentul genereaza o valoare < DBL_MIN Ex: exp(-1000)

TLOSS pierdere de digiti semnificativi ( Ex: sin(10e70) )

PLOSS pierdere partiala a semnificatiei=digiti nesemnificativi

valorile pentru DBL_MAX si DBL_MIN sunt definite in float.h

Valoarea returnata de functie este 1 daca eroarea matematica este de

tip UNDERFLOW sau TLOSS sau zero in celelalte cazuri.Daca functia retur-

neaza zero(semn ca nu a reusit sa corecteze eroarea),variabila errno este

setata 0 si se afiseaza mesajul de eroare corespunzator.Daca functia re-

turneaza o valoare nonzero,nu se afiseaza nici un mesaj si nu se modifica

variabila errno.

Versiunile UNIX ale functiei matherr() nu sunt compatibile cu standar-

dul ASCII si nu pot fi importate in versiunile MS-DOS ale programelor.

Practic,pentru modificarea modului de manevrare a erorilor se va uti-

liza un algoritm oarecare prin care variabila retval va specifica daca

a intervenit sau nu o eroare.In cazul in care retval returneaza doar

valori nonzero,acestea vor fi utilizate atunci cand functia genereaza

o eroare de tip matematic(poate returna un numar de cod fix,care semna-

leaza eroarea dar nu modifica executia programului ).

Functia se utilizeaza mai ales in etapa de depanare a programelor.

-195- [ math.h - modf() ]

EXEMPLU: #include

#include

#include

#include

double x,y,z;

main()

{

printf("log(-1)= %lf \n",log(-1));

printf("eroarea este:%d \n",errno);

printf("exp(-1000)= %lf \n",exp(-1000));

printf("eroarea este: %d \n\n",errno);

sleep(5);

}

Apoi modificati functia matherr() si repetati aplicatia ca in exemplul

urmator: #include

#include

#include

#include

double x,y,z;

int matherr(struct exception *ex)

{ ex->type=7;

ex->name="functia log";

ex->arg1=5;

ex->arg2=3;

ex->retval=7777.77;

}

main()

{

printf("log(-1)= %lf \n",log(-1));

printf("eroarea este: %d \n",errno);

printf("exp(-1000)= %lf \n",exp(-1000));

printf("eroarea este: %d \n\n",errno);

sleep(5);

}

Observati ca functia returneaza valoarea implicit (7777.77 =retval)

indiferent de tipul de eroare intalnita.Scrieti un algoritm care sa

corecteze doar un anumit tip de eroari matematice.

Versiunea C++ include functiile _matherr() si _matherrl() care este

similara dar opereaza si returneaza numere de tip long double,respectiv

structura este de tip _exception iar arg1,arg2 si retval sunt valori de

tip long double.SINTAXA GENERALA este:

int _matherrl( struct _exception *e)
FUNCTIA modf() si modfl()

-imparte un numar double in partea intreaga si in partea fractionara

SINTAXA GENERALA este: double modf(double x,double *ipart);

Practic functia separa partea din fata virgulei de cea care urmeaza dupa

virgula.Partea intreaga va fi un numar de tip double (cel specificat prin

pointerul ipart) iar partea fractionala va fi tot un numar de tip double

(adica numarul returnat de functie).

Functia returneaza partea fractionara a numarului de tip double.


-196- [ math.h - poly() ]

Versiunea C++ include si functia modfl() care este similara dar opereaza

si returneaza numere de tip long double.SINTAXA GENERALA este:

long double modfl(long double x,long double *ipart)

EXEMPLU: #include

#include

#include

#include

double a,b,x,z;

main()

{

randomize();

for (z=1;z<20;z++)

{ x=random(30000)/0.37;

a=modf(x,&b);

printf("numarul aleator este: %lf \n",x);

printf(" partea intreaga este: %lf \n",b);

printf(" partea fractionara este: %lf \n\n",a);

sleep(3);

}}
FUNCTIA poly() si polyl()

-genereaza un polinom din argumentele specificate

SINTAXA GENERALA este: double poly(double x,int degree,double coeffs[]);

unde: x este numarul

degree este puterea (cea mai mare=gradul polinomului)

coeffs[] este lista coeficientilor (in ordine inversa)

Functia genereaza un polinom de gradul (degree) cu (degree+1) membri,in

care fiecare membru va avea coeficientul specificat in lista coeffs[].

Coeficientii din lista sunt preluati dupa regula LIFO(last in first out)

astfel incat ultimul din lista va fi aplicat primul(pentru membrul care

contine exponentul maxim al lui x).

Exemplu: #include

#include

#include

double arie[]={2,2,-1,-5,-2,-1};

double rezultat;

double a,b,r;

int z;

main()

{ for(z=1;z<10;z++)

{ printf("Ecuatia este: x^5+2*x^4-5*x^3-2*x^2+x+2 \n");

rezultat=poly(z,5,arie);

printf("pentru x= %d \n",z);

printf("rezultatul este: %lf \n",rezultat);

printf("verificare: \n");

r=pow(z,5)+2*pow(z,4)-5*pow(z,3)-2*pow(z,2)+z+2;

printf("%lf \n\n",r);

sleep(5);

}}

Este important ca lista de coeficienti sa contina cate un coeficient

pentru fiecare membru al polinomului generat,si in ordinea corecta.


-197- [ math.h - pow() si pow10() ]

Functia returneaza rezultatul obtinut prin evaluarea polinomului generat

pentru valoarea specificata a lui x.Numarul rezultat va fi un numar de

tip double.

Atentie la formarea listei de coeficienti,astfel incat ultimul din lista

sa corespunda primului membru iar primul din lista sa corespunda ulti-

mului membru al polinomului.Exemplu: pentru un polinom de gradul patru,

polinomul generat va fi de forma:

coeffs[4]x^4 + coeffs[3]x^3 + coeffs[2]x^2 + coeffs[1]x + coeffs[0]

In versiunea C++ este inclusa si functia polyl() care este similara dar

opereaza si returneaza numere de tip long double.SINTAXA GENERALA este:

long double polyl(long double x,int degree,long double coeffs[]);
FUNCTIA pow() si powl()

-calculeaza x la puterea y (numere exponentiale de tip double)

SINTAXA GENERALA este: double pow(double x,double y);

Functia calculeaza valoarea numarului exponential descris.Poate fi apelata

si pentru numere complexe sau BCD(binary-coded decimals).

Functia returneaza valoarea rezultata.

Daca argumentul x transferat functiei este un numar real negativ iar y nu

este un numar intreg,rezultatul nu este reprezentabil si functia seteaza

variabila errno la valoarea ERANGE(rezult out of range).Daca se apeleaza

functia cu ambele argumente egale cu zero (pow(0,0) ) atunci variabila

errno este setata EDOM (domain error).

Pentru y=0 sau x=0 si y=0 functia returneaza 1 iar pentru y<0 INF.

Valoarea maxima reprezentabila este 2 la puterea 64.Notatiile mai mari

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   23   24   25   26   27   28   29   30   ...   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin