Saturday, December 30, 2017

Fiabilitatea programelor și ordinele de mărime

În programele FORTRAN IV se lucra cu:
- variabile și constante de tip întreg definite pe 4 bytes;
- variabile și constante de tip real definite pe 4 bytes;
- variabile și constante de tip real definite pe 4 bytes;
- variabile și constante de tip logic
- variabile și constante de tip complex definite pe 4+4 bytes.
Fiecare constantă sau variabilă este caracterizată prin magnitudine, adică valoare maximă, respectiv, valoare minimă și prin ordin de mărime, adică număr de cifre maxim ce se stochează în zona de memorie care se alocă.
O constantă de tip întreg care este definită pe 4 bytes are cel mai mare număr ce se stochează acolo egal cu 2 la puterea 31 minus 1, cunoscătorii știu de ce..., adică magnitudinea maximă este de 2147483647. Deci dacă cineva dorește să scrie un program fiabil în care adună două numere IA și IB trebuie să verifice dacă:
  • IA > 2147483647;
  • IB > 2147483647;
  • IA+IB > 2147483647.
Având în vedere că în calcule toate variabilele sunt cu aceeași importanță, este rezonabil să se ia în considerare pentru fiecare dintre ele un domeniu care să asigure fiabilitatea programului în orice condiții. Din punctul meu de vedere, domeniul de variație al variabilelor nu trebuie calculat pe bucățele, ci per global, pentru a da generalitate și operaționalitate programului, adică programul să funcționeze în orice condiții, nu uneori da și de o mie de ori, nu.
Dacă se consideră doi operanzi de tip întreg OP1 și OP2 având N1 și respectiv N2 cifre, când se face o operație de adunare sau de scădere rezultatul REZ = OP1 + OP2  va avea un număr de cifre egal cu NREX = max (N1,N2) +1. Ca un program să fie fiabil trebuie ținut seama și de acest aspect. Dacă rezultatul REZ nu trebuie să fie mai mare în valoare absolută decât 2147483647, înseamnă că operanzii OP1 și OP2 nu trebuie să fie mai mari în valoare absolută decât 2147483647/2, adică mai mare decât 1072418237. Sunt chestiuni învățate în școala elementară, despre care foarte mulți dintre noi nu le-am considerat importante atunci, dar care pentru a face programe fiabile revin în forță.
Dacă se consideră doi operanzi de tip întreg OP1 și OP2 având N1 și respectiv N2 cifre, când se face o operație de înmulțire rezultatul REZ = OP1 * OP2  va avea un număr de cifre egal cu NREX =  N1+N2. În acest context OP1 și OP2 nu trebuie să fie mai mari de 46340 pentru a nu avea dureri de cap cu derularea calculelor și fără a fi nevoiți să stabilim numărul de cifre al numărelor stocate în zonele de memorie OP1 sau OP2.
Este rezonabil să introducem prin programele noastre colo și colo instrucțiuni precum:
                  IF((OP1.GT.1072418237).OR.(OP2.GT.1072418237)) GO TO 10
                  REZ = OP1 + OP2
                  IK=1
sau
                  IF((OP1.GT.46340).OR.(OP2.GT.46340)) GO TO 10
                  REZ = OP1 * OP2
                  IK=2
....................
10              IK=0
....................
Unde IK=0 dacă operațiile de calcul nu se efectuează din motive de depășire a capacității sau IK=1 în ideia că operațiile se efectuează. Dacă suntem convinși că trebuie să verificăm efectuarea calculelor se vor face conversii pe real a operanzilor și numai după efectuarea calculelor finale se va face testul dacă rezultatul final este mai mare decât constanta reală 2147483647. ceea ce va conduce la atribuirea valorii IK=0 cum că s-a produs o depășire care duce la trunchiere dacă se face conversie de la real spre întreg.
Fiabilitatea programelor și ordinele de mărime merg mână în mână și în vremurile de demult subdepășirea dar și depășirea de capacitate au dat mari bătăi de cap programatorilor mai ales când erau neglijeate oarece inițializări și se lucra cu operanzii neinițializați spre direcționarea în zone aleatoare a rezultatelor finale.




(30 decembrie 2017)

No comments:

Post a Comment