PDA

Visualizza la versione completa : Problema conversione C++ da unsigned short a float


tonyzz
04-12-2015, 10:12
Ciao a tutti,
ho una conoscenza veramente basica di C++, e l'altro giorno, ad una job interview, mi è stato chiesto di risolvere un problema in questo linguaggio (uso solo ADA a lavoro e purtroppo non sono un informatico), che però non ho capito e quindi mi è rimasto il dubbio.
Ho chiesto all'intervistatore di girarmi il pdf, che ho allegato qui, con la descrizione della word da convertire in float, perchè vorrei porvi i miei dubbi e chiedere una mano nella risoluzione postuma.

Il problema può essere posto all'incirca così, se ricordo bene le parole dell'intervistatore:

"On this pages, a "high SNR" number format is described.
Please write a converter function in C/C++ that take an unsigned short as input (in the format described) and returns a float."

Il formato è costituito da 11 bit per la mantissa (da 0 a 10), uno per il segno (bit 11) e 4 bit per l'esponent (da 12 a 15)

Ecco, il primo ostacolo è che non capisco come funziona questo formato, perchè dice che per ottenere la decodifica devo prendere, nel caso di esponente non nullo 13 bit (mantissa più davanti 01 o 10) e moltiplicarli per 2**(esponente-25); se l'esponente è nullo, trattarlo come intero 12 bit con segno + mantissa e moltiplicarlo per 2**-24.

Quindi per convertire in float dovrei prima calcolare il valore della word "high SNR" tramite la discriminante dell'esponente e poi metterlo su 32 bit?
Il problema è che non capisco come viene formato il numero.

Es. mettimano che la word sia popolata come:

1000 1 10100000000

Che numero dovrei ottenere?
Da come suggerisce nella codifica, sembrerebbe:

l'esponente non è zero, quindi sono nel primo caso, quindi ho

- l'intero 13 bit (S è 1, negativo) 10 10100000000
- l'esponente 1000

Convertendo l'intero 13 bit in complemento a due (tolgo uno e inverto i bit), dovrei ottenere: -0101100000000 = -2816

Secondo l'algoritmo dovrei decodificare come: (intero 13 bit) * 2**(exp -25),
quindi -2816* 2**(8-25) = -0,021484375

A me sembra un valore senza senso, quindi penso di sbagliare qualcosa nel ragionamento.

Il secondo massaggio sarebbe poi rendere il numero ottenuto in float (che io ho inteso come float standard 754 a 32 bit, quindi con 8 bit per esponente e 23 per la mantissa.

Altra cosa: come potrei strutturare in C++ la word "High-SNR" da dare in ingresso alla funzione, così da poter estrarre i 3 campi con lo shift dei bit?


Grazie mille per l'aiuto,
Anto

Loading