Conversion char* en float, et float en char*

cs_MrAzerty Messages postés 2 Date d'inscription jeudi 26 janvier 2006 Statut Membre Dernière intervention 16 juin 2006 - 16 juin 2006 à 10:29
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 17 juin 2006 à 12:13
Mon problème est simple, je souhaie pouvoir convertir une chaine de caractères contenant un réel ("78.46", par exemple),
à la norme IEEE 754 (comme les float) , et cela sans utiliser de float, ni de "%f", ni rien qui touche de près ou de loin au type float.
La valeur devra donc ensuite être mémorisée sur 32bits, dans un unsigned long par exemple.
Merci par avance pour votre aide...
A voir également:

4 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
16 juin 2006 à 11:04
Pourquoi tu veux pas te servir  float ? c'est pourtant plus simple :

#include <math.h>
char s[] = "78.46";
float val = (float)atof(s);

pour récuprer les 32 bits du format IEEE :
unsigned long ieee = *((long*)&val);

Si tu veux recoder atof, tu peux mais sans utiliser le type float c'est un brin compliqué
0
cs_MrAzerty Messages postés 2 Date d'inscription jeudi 26 janvier 2006 Statut Membre Dernière intervention 16 juin 2006
16 juin 2006 à 18:18
En fait mon code ne sera pas compilé pour un pc mais pour un calculateur 16 bits (sc12). Le types float est mal géré par ce dernier, je me suis rendu compte que de nombreux dépassements mémoires aparaissaient, dus à cette mauvaise gestion... En rendant une visite sur le site web du constructeur (et en cherchant quelques heures), je me suis aperçu qu'il existaient une solution, mais non apliquable au C++ pour des raisons trop longues à expliquer (pointeurs sur des fonctions C,etc).
Or, les données doivent impérativement être stockées au format IEEE 754, car le programme comunique en liaison série avec un esclave Modbus, utilisant cette norme.

Donc, je résume:
-Impossiblilité d'utiliser le type float, ni les "atof()" sous peine de dépassement mémoire et donc de plantage aléatoire
-Nécéssité de stocker quand même les données au format IEEE 754

J'ai éssayé de faire un algorithme à partir d'explications, comme celles-ci .
Cela me parait extrêmement compliqué, dans mon cas...

J'ai tout de même réussi à compiler une version stable, utilisant les floats. Ce projet sera présenté à un jury dans le cadre de mon bts très prochainement, je pense que je vais m'en tenir à cette version.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
17 juin 2006 à 12:13
utilise ssprintf ou sscanf si libc standart,  ou wsprintf  si win32.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
17 juin 2006 à 12:13
sprintf pardon .
0
Rejoignez-nous