16 Dicembre 2002
Transcript
16 Dicembre 2002
COMPITO DI FONDAMENTI DI INFORMATICA Allievi Ingegneri Meccanici Appello del 16 Dicembre 2002 Aula 1 (09.00 – 12.00) Esercizio 1 (punti 7) Un elaboratore adotta per i numeri interi una rappresentazione in complemento a due su 8 bit e per i numeri reali una rappresentazione in virgola mobile con un byte per la mantissa normalizzata in segno/modulo e un byte per l’esponente in complemento a due. Si consideri l’espressione: 25 -12 + 2.3 Indicare il risultato dell’espressione ottenuto eseguendo il calcolo con l’elaboratore dato. Mostrare i passaggi intermedi eseguiti dall'elaboratore con particolare riferimento alle operazioni ed alla rappresentazione interna in binario, nonché i relativi eventuali errori compiuti. Scrivere il risultato finale anche in codifica decimale. Esercizio 2 (punti 5) Si eseguano le seguenti operazioni rappresentando gli operandi in complemento a due su 12 bit: (a) (b) (181)10 – (1455)10 (747)10 + (1300)10 Si esprimano poi i risultati delle operazioni precedenti nel sistema esadecimale. Esercizio 3 (punti 3) Quale è il numero minimo di cifre binarie necessarie a rappresentare in complemento a due il numero (–87.46875)10? Esercizio 4 (punti 15) È assegnato un file di nome “INP.DAT” contenente N numeri relativi (uno per ogni riga del file), in ordine crescente. Scrivere un algoritmo, in linguaggio Fortran, capace di riscrivere gli N numeri in un altro file, di nome “OUT.DAT”, in ordine decrescente. I dati devono essere letti dal file di input con il formato “F4.0”, formato da usare anche per il file di output. L’algoritmo dovrà inoltre calcolare, utilizzando una function (esterna), la sommatoria dei quadrati dei logaritmi degli N numeri: N y = ∑ [ Log ( xi )] 2 i =1 il cui risultato dovrà poi essere scritto sullo standard output insieme al numero di elementi negativi rilevati nel file di input: “INP.DAT”. Prevedere tutti i controlli del caso. Soluzioni 25 -12 + 2.3 Esercizio 1 (7 punti) 25: -12: 0001 1001 modulo 00001100 complemento a due: 11110100 2.3: 10.010011001.... = 10.01001 normalizzando: .10010011 * 2^2 errore di troncamento (2.296875) 25 – 12 = 00011001 + (25) 11110100 = (-12) -------------------------(1)00001101 (13) Il riporto è oltre il bit di segno e lo si trascura. Trasformo in floating point: .11010000 * 2^4 13+2.3= .11010000 * 2^4 + .00100100 * 2^4 = errore di incolonnamento -----------------------0.11110100 * 2^4 Valore 1111.0100=15.25. ♦ Esercizio 2 (a) (5punti) (b) (181)10 – (1455)10 (747)10 + (1300)10 (a) (+181)10 = (+1455)10 = complemento = (-1455)10 Infine (+181)10 + (-1455)CA2 = -----------------(-1274)10 000010110101 010110101111 101001010000 + 000000000001 = -----------------------(101100000110)CA2 000010110101 + 101100000110 = --------------------101100000110 = (B06)16 . ♦ (b) (+747)10 (+1300)10 = = (+2047)10 001011101011 010100010100 -----------------------(011111111111)CA2 = (7FF)16 . ♦ Esercizio 3 (3punti) (–87.46875)10 = (10101001.01111)CA2 [R.: 13 cifre binarie]. Sviluppo (+87)10 = 0 1010111 comp. = 1 0101000 + 0 0000001 = ----------------------------(-87)10 = (1 0101001)CA2 0.46875 0.9375 0 1 0.875 1 0.75 1 0.5 0. 1 Da cui (0.46875)10 = (0.01111)2 Concludendo: (–87.46875)10 = (10101001.01111)CA2 ♦ Esercizio 4 (Prima soluzione Approssimata, cioè non generalizzata) (15 punti) Program sumlog c parameter (N = 10) real el(N),flogar,r,sum open(20,file='inp.dat',status='unknown',access='sequential') open(30,file='out.dat',status='unknown',access='sequential') i=1 do while(.not. EOF(20)) read(20,100) el(i) i=i+1 end do do i=N,1,-1 write(30,100) el(i) end do close(20) sum = 0 icont = 0 do i=1,n if(el(i) .GT. 0.) then r = flogar(el(i)) sum = sum + r else icont = icont + 1 endif end do write(*,*) 'SUM(Log(x)**2) = ', sum write(*,*) 'Numero di elementi negativi rilevati =',icont write(*,*) c 100 format(f4.0) stop end REAL FUNCTION FLOGAR(X) flogar = Log(X)**2 return ♦ end Esercizio 4 (Seconda soluzione Esatta, cioè generalizzata) (15 punti) Program logfun real a,sum,r open(20,file='inp.dat',status='unknown',access='sequential') open(30,file='out.dat',status='unknown',access='sequential') n=0 icont = 0 sum = 0. do while(.not. eof(20)) read(20,100) a if(a .GE. 0) then r = flogar(a) sum = sum + r else icont = icont + 1 endif n=n+1 end do write(*,*) write(*,*) 'numero di elementi negativi = ',icont write(*,*) 'sommatoria dei quadrati dei logaritmi = ',r write(*,*) close(20) close(30) c call inverti(n) c 100 format(f4.0) stop end REAL FUNCTION FLOGAR(X) flogar = Log(X)**2 return end Subroutine inverti(n) real b(n) open(20,file='inp.dat',status='unknown',access='sequential') open(30,file='out.dat',status='unknown',access='sequential') read(20,100) (b(i),i=1,n) write(30,100) (b(i),i=n,1,-1) close(20) close(30) 100 format(f4.0) return end