(J'ai marqué la question "C" pour le moment, mais si vous connaissez une autre langue qui prend en charge les syndicats, vous pouvez également l'utiliser.)
Votre tâche consiste à créer les quatre opérateurs mathématiques standard + - * /
pour la structure suivante:
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;}
}
de sorte que les opérations elles-mêmes ne manipulent ou n'accèdent qu'à la partie entière (donc pas de comparaison avec le double à tout moment pendant l'opération), et le résultat est exactement le même (ou fonctionnellement équivalent, dans le cas de résultats non numériques tels que NaN
) comme si l'opération mathématique correspondante avait été appliquée directement à la double
place.
Vous pouvez choisir quelle partie entière manipuler, peut-être même en utiliser différentes parmi différents opérateurs. (Vous pouvez également choisir de supprimer le "non signé" de l'un des champs de l'union, même si je ne suis pas sûr que vous souhaitiez le faire.)
Votre score est la somme de la longueur du code en caractères pour chacun des quatre opérateurs. Le score le plus bas l'emporte.
Pour ceux d'entre nous qui ne connaissent pas la spécification IEEE 754, voici un article à ce sujet sur Wikipedia.
Modifications:
03-06 08:47 Ajout de constructeurs à la structure intfloat. Vous êtes autorisé à les utiliser pour les tests, plutôt que de définir manuellement le double / etc.
intstruct
en termes de uint8_8
, uint16_t
et ainsi de suite, car les tailles absolues de short
, int
et ainsi de suite ne sont pas définies par la norme (chaque type a une taille minimale et il existe un ordre de taille strict, mais c'est ça).