infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Alexandru-Iancu Caragicu din Februarie 18, 2011, 15:13:31



Titlul: Stocare infiniti in variabile
Scris de: Alexandru-Iancu Caragicu din Februarie 18, 2011, 15:13:31
Am observat de ceva timp o diferenta mare in ceea ce priveste operatiile din C# vs C++.

La overflow, variabilele din C++ intra pe numere negative, in timp ce cele din C# iau valoarea unei constante ce reprezinta infinit.
Si de aici toate operatiile de fac corect.
INF + const = INF
INF - const = INF
INF * (-1) = -INF

la nedeterminari inca n-am incercat sa vad ce face, dar mi se pare o chestie destul de utila pt proiectele mai mari.

Oare operatiile sunt incetinite mult din cauza asta? Stiu ca in C++, nr ies negative pt ca asta obtii daca aplici operatiile, in C# or fi ceva if-uri in cadrul operatiilor ca sa puna valoarea INF?


Titlul: Răspuns: Stocare infiniti in variabile
Scris de: Sima Cotizo din Februarie 21, 2011, 20:45:51
Ai inf pe double, e util daca vrei sa sortezi dupa tangenta de exemplu. Cred ca daca incerci atan(pi/2) obtii asta. Functioneaza compararea bine, nu sunt sigur insa in priviinta operatiilor.


Titlul: Răspuns: Stocare infiniti in variabile
Scris de: Alexandru-Iancu Caragicu din Februarie 22, 2011, 15:34:05
Ai inf pe double, e util daca vrei sa sortezi dupa tangenta de exemplu. Cred ca daca incerci atan(pi/2) obtii asta. Functioneaza compararea bine, nu sunt sigur insa in priviinta operatiilor.
si daca pe urma aduni 100 sau scazi 100, ramane INF?
Si daca inmultesti cu -1, ajunge -INF?


Titlul: Răspuns: Stocare infiniti in variabile
Scris de: niculae alexandru din Martie 16, 2011, 23:17:36
trece la ca fiind inf/-inf orice nr care depaseste limita doubel-ului. daca incerci pe urma sa scazi din el sa sa aduni nu se schimba dar daca il inmultesti cu -1 trece la -inf/inf... dar poti sa experimentezi si tu singur singur in mingw;d


Titlul: Răspuns: Stocare infiniti in variabile
Scris de: Chibici Tiberiu din Martie 18, 2011, 22:25:27
In C++ exista la tipul de date float/double variabila de tipul NaN (Not a Number), care e mai ciudat.
(de exemplu daca f = NaN, expresia (f != f) are rezultat 'True').

Totusi in C++ poti creea o clasa care sa substituie tipul de date pe care il vrei.

Aici e un exemplu foarte simplu:

Cod: (c++)
class Int
{

public:
   int value;

   int Inf;

   Int() { Inf = 0x7FFFFFFF; }
   Int(int val) { value = val; Inf = 0x7FFFFFFF; }
   
   Int operator+ (Int b)   { 
          if (value != Inf && value != -Inf && b.value != Inf && b.value != -Inf) return Int(value + b.value);
          if (value == Inf || value == -Inf) return Int(value);
          return Int(b.value);
   }
};

La fel pot fi definiti toti ceilalti operatori. (-*/)

Pentru produs si diferenta este putin mai delicat, pentru ca poti avea nedeterminari (de exemplu Inf/Inf, 0/0, Inf-Inf etc).