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