Utilizarea unui coprocesor sporește semnificativ precizia calculelor matematice și accelerează implementarea lor. Singurul lucru este mic - disponibilitatea și capacitatea de utilizare.
Pentru ca programul să folosească capacitățile coprocesorului, trebuie să aibă o directivă (cheia modului compilator) $ N + la începutul lui:
Modul de compilare N + este global și nu poate fi modificat în viitor. Atunci când se creează module (UNIT), orientate spre a lucra cu coprocesorul, adică folosind tipurile pe care le introduc, cheia $ N + din ele este opțională. Este important doar că este în programul principal, care include aceste module.
Dacă este necesar, dezactivați coprocesorul ar trebui să indice cheia $ N-. În acest caz, programul se poate opri compilarea (compilatorul va "uita" tipurile de numere cu precizie crescută).
Dacă un coprocesor este instalat pe PC, compilatorul însuși determină cuvântul cheie CPU87 pentru compilarea condiționată. Aceasta poate fi utilizată pentru a selecta automat modul de compilare:
Construcția de mai sus specifică modul în care va fi compilat textul - cu sau fără coprocesor.
După compilare, execuția programului începe de fiecare dată cu verificarea prezenței coprocesorului și determinarea tipului acestuia. Rezultatul verificării este scris la variabila predefinită a bibliotecii de sistem - Test8087 de tip Byte (Tabelul 9.8).
Valorile Test8087 conectate 8087 2 conectate 80287 3 conectate 80387
Dacă programul a fost compilat în modul și valoarea Test8087 sa dovedit a fi 0, atunci programul se va opri cu un mesaj despre necesitatea unui coprocesor. Cu toate acestea, există o modalitate de a dezactiva verificarea automată a coprocesorului atunci când programul este pornit. Trebuie să introduceți variabila de sistem MS-DOS cu numele 87 și valorile Y (de la YES) și N (de la NO-no). Este mai bine să faceți acest lucru în fișierul AUTOEXEC.BAT prin introducerea unui șir
Valoarea variabilei sistem MS-DOS 87, egală cu Y, indică coprocesorului să fie considerat conectat și N - respectiv dezactivat. În general, este mai bine să nu înșele tehnicile și programele. Salvați această tehnică (cu SET 87 =) pentru cazul extrem.
Turbo Pascal permite programarea automată a coprocesorului. Aceasta înseamnă că puteți crea un program care va funcționa cu o precizie ridicată, indiferent de prezența coprocesorului. Este detectat un coprocesor - bine, acesta va fi încărcat, nici un coprocesor - toată precizia va fi obținută prin simularea acestuia. Este evident că în ultimul caz vor exista pierderi în conturile de timp și vor fi considerabile. Cheia $ E controlează emularea. Are sens doar cu cheia $ N. Următoarele combinații sunt posibile:
- Conectarea unei biblioteci pentru emularea unui coprocesor; în lipsa acesteia, precizia este asigurată programat de viteză; - programul va putea lucra numai pe mașini cu coprocesor;
și - coprocesorul nu este utilizat, cheia de emulare este ignorată. Programul funcționează numai cu precizia și viteza obișnuite.
Dacă un cod extern este introdus în program printr-o directivă, atunci pentru a lucra cu coprocesorul acest cod trebuie obținut ținând cont de utilizarea instrucțiunilor 80X87.
Avantajele utilizării unui coprocesor sunt, în primul rând, viteza de calcul, care poate crește de mai multe ori. Cel de-al doilea avantaj este o creștere a preciziei calculelor în virgulă mobilă. În ceea ce privește coprocesorul matematic, sunt introduse tipurile enumerate în tabelul 1. 9.9.
Toate aceste tipuri sunt reale, cu excepția Comp, care este un tip întreg "foarte lung" (stochează numai valori întregi). Intervalul de acest tip din tabel este dat într-un mod rotund, deoarece numerele reale (-2 la 263-1) sunt prea lungi.
Tipul real real (6 octeți, 2.9E-39, 1.7E + 38, 11-12 cifre semnificative) va funcționa cu coprocesorul, dar este extrem de ineficient. Acest format este străin coprocesorului, iar timpul "mâncat" prin transformarea acestuia într-un tip coprocesor se suprapune peste accelerație. Și precizia nu este adăugată. Prin urmare, este mai bine să introduceți propriul dvs. tip, de exemplu Float, și să înțelegeți tipul real sau coprocesorul real sub acesta, în funcție de modul de compilare.
d. Array [1..9] de Float;
Întregul tip Turbo Pascal lucrează cu coprocesorul fără nici o rezervă.
O importanță deosebită este chestiunea corectitudinii calculelor. Când utilizați un coprocesor, toți operatorii matematici standard și funcțiile lingvistice care în mod normal returnează valorile Real încep să restituie valori de tip Extended. În acest sens, este logic să se bazeze pe acest tip ca pe cel de bază. Cu toate acestea, este foarte posibil ca variabilele de diferite tipuri să participe la program. În astfel de cazuri, dacă este necesar, valorile vor fi convertite și, prin urmare, pierderea preciziei. Atunci când se calculează valorile părților potrivite ale operatorilor de atribuire, rezultatul are o precizie care coincide cu cea mai exactă dintre tipurile de membri ale expresiei (sau, care este aceeași, cu cel mai mare tip). Acest lucru înseamnă că în atribuire
valoarea expresiei din dreapta va fi evaluată ca extinsă. Dar când îi atribuiți variabila rezultată la un tip "mic" unic, trunchierea se va face, iar numărul de cifre semnificative după punctul zecimal va scădea drastic. Astfel de situații ar trebui să fie prevăzute și să încerce să le evite. Ele sunt deosebit de neplăcute în ciclurile de sumare:
pentru i: = 32767 la 65535 nu Sum: = Sum + i / e;
Aici, pierderile similare vor fi repetate de mii de ori, iar eroarea acumulată poate fi proporțională cu suma în sine. Pentru a rezolva situația este ușor: trebuie să introduceți o variabilă suplimentară eSum de tip exact Extinsă pentru sumatorul și rescrieți buclă:
pentru i: = 32767 la 65535 face eSum: = eSum + i / e;
Acum pierderile vor fi mult mai mici.
Din același motiv (datorită trunchierii preciziei) este funcționarea incorectă a compararea a două tipuri diferite de variabile reale sau variabilă, cu o expresie (acesta din urmă, așa cum sa menționat deja, se poate calcula în tip Extended). Deci, comparația din exemplu:
cu corectitudine formală și evidentă va da rezultatul False - false, deoarece d are cifre mai puțin semnificative decât e. De obicei, atunci când se compară valorile reale, ele nu sunt verificate prin coincidență, ci prin gradul de divergență. Dacă acest grad este comensurabil cu precizia reprezentării celui mai dur număr, atunci valorile pot fi considerate egale. Astfel, condiția dacă în ultimul exemplu ar trebui rescrisă după cum urmează:
dacă Abs (d-e) <1.0Е-15 then.
Aici 1.0E-15 este precizia pentru tipul variabilei d (Double).
Să continuăm lista caracteristicilor aplicației coprocesor. Prezența sa în PC și utilizarea sa afectează în mare măsură funcția rotundă de rotunjire: începe să rotunjeze valorile de o jumătate spre cel mai apropiat număr întreg (aceasta se numește "metoda bancară")! De exemplu:
fără coprocesor cu coprocesor
Rotundă (0,5) -> 1 rundă (0,5) -> 0
Rotundă (1.5) -> 2 rundă (1.5) -> 2
Runda (2.5) -> 3 rundă (2.5) -> 2
Runda (3.5) -> 4 Runda (3.5) -> 4
Cu valorile rămase (fără '.5'), funcția funcționează bine.
Unele probleme pot aștepta pentru fanii unei abordări recursive la scrierea unei funcții. În principiu, situațiile sunt posibile atunci când apelurile recursive depășesc stiva internă a datelor coprocesorului, calculate pentru opt niveluri de recursiune, iar programul va eșua. O soluție posibilă ar fi expresii cum ar fi diversitatea slozhnorekursivnyh Fn: = Fn (N-1) + Fn (N-2) variabilelor locale, de exemplu, f1: = Fn (N-1); și f2: = Fn (N-2). După aceasta, expresia Fn: = f1 + f2 va fi sigură pentru coprocesor.
Concluzionând tema folosind un coprocesor, amintim că, și avansate tipuri reale, și tipul real atunci când se utilizează un operatorii de scriere coprocesor 80X87 tipărite și WriteLn cu 4 cifre în exponent:
la $ N- WriteLn (123.4) va da 1.2340000000Е + 02,
dar cu $ N + WriteLn (123.4) va da 1.234000000000000E + 0002.
Acest fapt trebuie luat în considerare la ieșirea formatată și la conversia numerelor într-un șir prin procedura Str.