(Per il momento ho taggato la domanda "C", ma se sei a conoscenza di un'altra lingua che supporta i sindacati, puoi anche usarla.)
Il tuo compito è costruire i quattro operatori matematici standard + - * /
per la seguente struttura:
union intfloat{
double f;
uint8_t h[8];
uint16_t i[4];
uint32_t j[2];
uint64_t k;
intfloat(double g){f = g;}
intfloat(){k = 0;}
}
in modo tale che le operazioni stesse manipolino o accedano sempre alla parte intera (quindi nessun confronto con il doppio in qualsiasi momento durante l'operazione) e il risultato è esattamente lo stesso (o funzionalmente equivalente, nel caso di risultati non numerici come NaN
) come se l'operazione matematica corrispondente fosse stata applicata direttamente al double
contrario.
Puoi scegliere quale parte intera manipolare, magari usando anche parti diverse tra operatori diversi. (Puoi anche scegliere di rimuovere il "unsigned" da uno qualsiasi dei campi nell'unione, anche se non sono sicuro che tu voglia farlo.)
Il tuo punteggio è la somma della lunghezza del codice in caratteri per ciascuno dei quattro operatori. Il punteggio più basso vince.
Per quelli di noi che non hanno familiarità con la specifica IEEE 754, ecco un articolo al riguardo su Wikipedia.
modifiche:
03-06 08:47 Aggiunti costruttori alla struttura intfloat. Puoi usarli per i test, piuttosto che impostare manualmente il doppio / ecc.
intstruct
in termini di uint8_8
, uint16_t
e così via, come le dimensioni assolute di short
, int
e così via non sono definite dallo standard (ogni tipo ha una dimensione minima e c'è un ordinamento rigoroso nella dimensione, ma questo è tutto).