Skip to content

Rudymil/Norme_IEEE_754

Repository files navigation

ProjetPersonnel1-Rudolf_MILLET

Projet sur la norme IEEE 754

Enoncé

Bonjour à toutes et à tous,

Voici le premier projet que vous avez à faire en devoir personnel. Les livrables (ci-dessous) sont à rendre le 26/10/2016 à 23h59mn59s au plus tard par l'envoi d'un courriel à [email protected] indiquant l'URL du projet (Cf. infra). Le projet consiste en :

«
La saisie, la conversion et l'affichage sous forme d'une chaîne de caractères représentant les bits (0,1) de nombres réels en simple précision (32 bits) conformément à la norme IEE 754 (Cf. https://fr.wikipedia.org/wiki/IEEE_754).
Le logiciel permettra la saisie d'un nombre et l'affichage de sa représentation textuelle.
Le choix du langage est laissé à l'appréciation de chacun-e.
Le livrable attendu est un projet sur gitlab (sous votre compte dans le groupe TSI2106) avec le code source (analyse, code, chaîne de compilation/livraison) et une vidéo démontrant le résultat (pas plus de 2mn).
»

La structure du logiciel sera la base de l'évaluation (découpage, ré-utilisabilité, complexité à maintenir, documentation, tests et utilisation par l'équipe pédagogique !).

Un bonus +1 sera attribué au premier livrable (dans la date de réception des courriels indiquant que le projet est livré) qui obtiendra une note supérieure strictement à 10.
Un bonus +1 sera attribué pour la documentation du livrable (modélisation, algorithmie, code source, choix effectués, vidéo).
La remise des livrables hors délai sera sanctionnée par un malus de -2.
Une note de 0 sera attribuée en cas de plagiat ou similitude des livrables.

Bon courage

Analyse

Le code source se trouve dans le répertoire "code".
Le code a été écrit en C++11 dans Qt Creator 4.1.0 basé sur Qt 5.7.0 (MSVC 2013, 32 bit) et compilé sous MinGW 32bit (Debug, Profile, Release).

Voici la seule classe utilisée dans ce projet et écrite dans "fenetre.h". Il s'agit d'une classe Qt qui permet la construction d'une simple fenêtre composée au moins d'un champs d'entrée et d'un bouton de validation. A cette classe est attachée une unique fonction connectée au bouton et qui lance le programme principal.

fenetre : public QWidget
	public:
		fenetre(QWidget * owner = nullptr)
	private:
		QLabel *titre
		QLineEdit *reel
		QPushButton *conversion
		QLabel *resultat
	public slots:
		void onClick()

Description

Après l'appel du constructeur de la fenêtre dans "main.cpp", le code se divise en deux parties.

Dans "fenetre.cpp" se trouve le constructeur de la fenêtre et la fonction connectée au bouton :

fenetre::fenetre(QWidget *owner):QWidget{owner},titre{new QLabel{"",this}},reel{new QLineEdit{"",this}},conversion{new QPushButton{"run_project",this}},resultat{new QLabel{"",this}}{...}

Cette classe gère les paramètres de la fenêtre.

void fenetre::onClick(){...}

Cette fonction s'assure que le réel à convertir est correctement écrit.

Dans "norme_ieee_754.cpp" se trouve la fonction principale appelée dans "fenetre.cpp" et toutes les fonctions annexes :

void norme_ieee_754(const char *const_reel, char *binaire_ieee_754){...}

Il s'agit du programme principale qui appelle dans l'ordre les fonctions en annexes.
Elle prend en entrée 2 chaînes de caractères : une constante et une à remplir.

void f_signe(char *reel, char *binaire_ieee_754){...}

Cette fonction ajoute 1 ou 0 au binaire en fonction du signe du reel en entrée.

void f_binaire(char *reel, char *binaire_sans_signe){...}

Cette fonction fabrique simplement le binaire du reel en entrée.
Elle appelle cependant les deux fonctions "binaire_post_coma" et "binaire_post_coma" pour traiter le réel en deux parties avant de concaténer les 2 binaires obtenus.

int f_virgule_mantisse(char *binaire_sans_signe, char *reel){...}

Cette fonction fabrique la mantisse du binaire normé en procédant au décalage de la virgule en fonction du réel d'entrée. Le décalage est renvoyé en sortie. La chaîne de caractères ainsi modifiée doit contenir toujours 25 caractères à la fin, à savoir la taille de la mantisse plus la virgule et le binaire implicite. On procède donc à un rajout ou à une suppression de bits.

void f_exposant(char *binaire_exposant, char *reel, int decalage){...}

Cette fonction fabrique l'exposant de taille 9 en fonction du décalage mesuré. Certaines exceptions sont prises en compte dans le processus d'où la présence du réel en entrée.

int binaire_ante_coma(int quotient, char *b_a_c){...}

Cette fonction convertie en binaire la partie entière d'un réel.

void binaire_post_coma(float decimale, int t_b_a_c, char *b_p_c){...}

Cette fonction convertie en binaire la partie décimale d'un réel.

void remove_coma(char *binaire_exposant){...}

Cette fonction supprime la virgule et le bit implicite de la mantisse. La mantisse possède donc bien 23 bits.

void affichage_console(char *binaire_ieee_754, char *reel){...}

Cette fonction gère un affichage propre du résultat final dans le terminal.

Installation

Pour utiliser l'application (testée uniquement sur Windows 10), il suffit tout simplement de lancer un des exécutables suivants :

build-code-Desktop_Qt_5_7_0_MinGW_32bit-Debug\debug\code.exe
build-code-Desktop_Qt_5_7_0_MinGW_32bit-Profile\release\code.exe
build-code-Desktop_Qt_5_7_0_MinGW_32bit-Release\release\code.exe

Pour d'autre OS, une recompilation du code source est possible et nécessaire.

Bibliographie

Codes ASCII ISO HTML

Compiler votre première fenêtre Qt

Convertisseur décimal, hexadécimal, binaire

Format simple précision (32 bits) exemple

Header files

How to convert QString to const char

Les chaînes de caractères

QMessageBox

Représentation des nombres réels dite à virgule fixe

Standard IEEE 754 des nombres à virgule flottante

Utilisation des Regex avec Qt

[ Tutoriel ] un guide pour bien commencer avec markdown

Merci à tous ceux qui m'ont aidé en résolvant mes problèmes rencontrés :

Passage de valeur par la méthode "connect" Qt

Conversion : QString -> const char

Démonstration :

ProjetPersonnel1 Rudolf MILLET

About

Projet Personnel 1 2016

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published