IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Convertir un double en char* (sans utilier sprintf)


Sujet :

C

  1. #21
    NairodDorian
    Invité(e)
    Par défaut
    Un itoa c'est vite réécrit et les résultats sont corrects.
    Sinon montre moi où y a des erreurs.

  2. #22
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par NairodDorian Voir le message
    Un itoa c'est vite réécrit
    Je suis prêt à parier que ton premier essai sera tout aussi erroné.

    et les résultats sont corrects.
    Sinon montre moi où y a des erreurs.
    Ce qui saute aux yeux c'est que le résultat est faux pour toute valeur hors de l'intervalle MIN_INT, MAX_INT.

  3. #23
    NairodDorian
    Invité(e)
    Par défaut
    Je suis prêt à parier que ton premier essai sera tout aussi erroné.
    Faut vraiment être NUL pour ne pas réussir du premier coup une fonction aussi SIMPLE !!! Je la code à chaque fois pour mes projets perso car j'exclu tjr la crt de mes projets.

    Ce qui saute aux yeux c'est que le résultat est faux pour toute valeur hors de l'intervalle MIN_INT, MAX_INT.
    D'où mon message : Vérifiez que la valeur de double tiens dans un 'int' !

  4. #24
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    Personnellement, je suis curieux de voir la qualité et la fiabilité du code que tu pourrais écrire "en juste quelques minutes" pour convertir un double en une chaine de caractères sachant que cela doit s'exécuter de manière fiable et performante sur un micro-controleur.

    Alors relèves tu le défi (puisque c'est si trivial) ?

    Tu te chronomètres et nous poste le code ?
    on peut tres bien coder ce code en juste quelques minutes. Ne me dite pas qu' il faut des jours pour pouvoir ecrire un code pareil. Personnellement, je l' avait dejà fait (mais en pascal) qu' on je debutais en programmation.
    Et je ne vois pas en quoi il serait necessaire d' engager un prof de math, car tout ce qu' il faut c' est d' avoir un peu d' imagination.

  5. #25
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par NairodDorian Voir le message
    Faut vraiment être NUL pour ne pas réussir du premier coup une fonction aussi SIMPLE !!! Je la code à chaque fois pour mes projets perso car j'exclu tjr la crt de mes projets.
    J'attends.

    D'où mon message : Vérifiez que la valeur de double tiens dans un 'int' !
    Désolé, je n'ai lu que le dernier de tes 3 messages consécutifs. Les crashs pour les valeurs dans (-1, 0) -- la deuxième source de problèmes que j'ai vu -- tu prévenais aussi?

  6. #26
    NairodDorian
    Invité(e)
    Par défaut
    Désolé, je n'ai lu que le dernier de tes 3 messages consécutifs. Les crashs pour les valeurs dans (-1, 0) -- la deuxième source de problèmes que j'ai vu -- tu prévenais aussi?
    Lorsque j'ai posté ma seconde version j'ai oublié de poster la "correction" que j'avais apporté à length. Désolé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int length(int v) {
    	return v == 0 ? 1 : log10(fabs(v)) + 1.0;
    }
    J'en profite pour apporter une légère retouche à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void sd2str_v2(char *lpszDest, double value) {
    	char *pDst;
    	int i, j;
    	pDst = lpszDest;
    	i = value;
    	value -= i;
    	itoa(i, pDst, 10);
    	if (i < 0.0) { pDst++; value = -value; }
    	pDst += length(i);
    	*pDst++ = ',';
    	for (j = 0; j < 17; ++j) {
    		value *= 10;
    		i = value;
    		value -= i;
    		if (i < 0.0) i = -i;
    		*pDst++ = '0' + i;
    	}
    	*pDst = 0;
    }
    Doit allé bon comme ça.

    J'attends.
    Ben tu vas pouvoir attendre longtemps. Je t'ai dit que je l'ai déjà fait pour mes projets perso car je vire la CRT systématiquement. Je n'ai rien à te prouver, dommage si tu reste dubitatif sur ce que j'affirme.

  7. #27
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par NairodDorian Voir le message
    Je n'ai rien à te prouver, dommage si tu reste dubitatif sur ce que j'affirme.
    Ben, ce que tu montres n'est pas très concluant... tu as mis plus que quelques minutes pour ne pas résoudre un problème bien simplifié (ne pas traiter toutes les valeurs des doubles) par rapport au problème de départ (il y a au moins toujours un problème d'arrondi). Sans compter que si on veut une fonction qui n'a pas de contrôle sur le format, on va plutôt aller vers l'équivalent de %g ou même un format demandant le nombre minimal de décimales pour permettre une lecture sans perte d'information.

    Mais bon, ce n'est pas moi qui ai prétendu que c'était faisable en quelques minutes. Les petits problèmes de gestion de précision qui vont s'inviter si on veut un résultat correctement arrondi nécessite une analyse qui nécessite de comprendre les flottants mieux que la moyenne des programmeurs, et un peu de temps aussi.

    Quant aux entiers, ce n'est pas tellement compliqué, mais le traitement de INT_MIN va poser problème aux personnes les plus naïves. Que tu n'y ait pas fait allusion me laisse craindre que tu n'en étais pas conscient.

  8. #28
    NairodDorian
    Invité(e)
    Par défaut
    tu as mis plus que quelques minutes pour ne pas résoudre un problème bien simplifié (ne pas traiter toutes les valeurs des doubles) par rapport au problème de départ (il y a au moins toujours un problème d'arrondi). Sans compter que si on veut une fonction qui n'a pas de contrôle sur le format, on va plutôt aller vers l'équivalent de %g ou même un format demandant le nombre minimal de décimales pour permettre une lecture sans perte d'information.
    Lorsque j'ai posé mon premier code je n'ai réfléchis qu'une minute. (ça à son importance )
    Il faut savoir aussi que les processeurs x86 travail avec des double (64 bits) par défaut sinon il faut modifié le champ PC (Precision Control bit 8 et 9).
    Le contrôle de l'arrondi (RC) peut-être aussi modifié en modifiant le bit 10 et 11.
    Bref tout ça pour dire que c'est le genre de fonction qui doit-être programmé en ASM, la faire en C revient à faire de la bidouille car on n'a pas un contrôle total et surtout il ne faut pas s'attendre à qqch de parfait beaucoup de nombres ne sont pas représentables de manière exacte.

    Quant aux entiers, ce n'est pas tellement compliqué, mais le traitement de INT_MIN va poser problème aux personnes les plus naïves.
    La fonction assure un fonctionnement sous certaines conditions c'est au programmeur de vérifier que tout va bien se passé à l'exécution comme quand tu programmes en ASM sinon tu vas avoir des exceptions ou alors l'exécution ne sera pas garanti. C'est l'appelant qui doit toujours être prudent jamais celui qui se contente de fourni un travail.

  9. #29
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Citation Envoyé par NairodDorian Voir le message
    Il faut savoir aussi que les processeurs x86 travail avec des double (64 bits) par défaut sinon il faut modifié le champ PC (Precision Control bit 8 et 9).
    Je n'ai pas compris ce que ça vient faire dans l'histoire mais par défaut c'est sur 80 bits donc plutôt long double (la mantisse fait 64 bits par contre).

    Citation Envoyé par NairodDorian Voir le message
    La fonction assure un fonctionnement sous certaines conditions c'est au programmeur de vérifier que tout va bien se passé à l'exécution comme quand tu programmes en ASM sinon tu vas avoir des exceptions ou alors l'exécution ne sera pas garanti. C'est l'appelant qui doit toujours être prudent jamais celui qui se contente de fourni un travail.
    "It's not a bug, it's a feature."

  10. #30
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Citation Envoyé par darrylsite Voir le message
    on peut tres bien coder ce code en juste quelques minutes
    Non, non et encore non dans le cadre d'une fonction qui doit être exécutée dans un micorocontroleur et doit donc être fiable à 100 % et cela pour toute la plage de valeurs du double.

    Certes le principe d'une telle fonction est relativement simple mais la production d'une fonction efficace et fiable ne prends pas 1 ou 2 minutes mais beacoup plus entre le temps de code, tests et améliorations.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  11. #31
    NairodDorian
    Invité(e)
    Par défaut
    Je n'ai pas compris ce que ça vient faire dans l'histoire mais par défaut c'est sur 80 bits donc plutôt long double (la mantisse fait 64 bits par contre).
    C'est ce que je voulais mais le l'ai mal exprimé.
    Il faut savoir aussi que les processeurs x86 travail avec des double (64 bits)
    Fallait comprendre 64 bits pour la précision.

  12. #32
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par NairodDorian Voir le message
    Lorsque j'ai posé mon premier code je n'ai réfléchis qu'une minute. (ça à son importance )
    Oui... c'est toi qui a écrit que ça suffisait, pas moi. Vu que j'ai déjà fait l'exercice en tentant de le faire correctement, je sais qu'il est plus compliqué qu'il n'y en a l'air.

    Il faut savoir aussi que les processeurs x86 travail avec des double (64 bits) par défaut sinon il faut modifié le champ PC (Precision Control bit 8 et 9).
    Le contrôle de l'arrondi (RC) peut-être aussi modifié en modifiant le bit 10 et 11.
    Bref tout ça pour dire que c'est le genre de fonction qui doit-être programmé en ASM, la faire en C revient à faire de la bidouille car on n'a pas un contrôle total et surtout il ne faut pas s'attendre à qqch de parfait beaucoup de nombres ne sont pas représentables de manière exacte
    .

    Mince alors... je l'ai fait sans assembleur. Pire, je ne vois pas en quoi l'assembleur aide beaucoup -- enfin, un peu les perfs du calcul entier multiprécision qui est nécessaire, mais les drapeaux de controles de la FPU n'aident pas beaucoup pour cela.

    La fonction assure un fonctionnement sous certaines conditions c'est au programmeur de vérifier que tout va bien se passé à l'exécution comme quand tu programmes en ASM sinon tu vas avoir des exceptions ou alors l'exécution ne sera pas garanti. C'est l'appelant qui doit toujours être prudent jamais celui qui se contente de fourni un travail.
    Tu as l'air de bien aimer de changer les specs quand ça te convient toi.

  13. #33
    NairodDorian
    Invité(e)
    Par défaut
    Tu vis dans un autre monde si tu crois que c'est la fonction qui doit te torché les fesses pcq t'as fais de travers.

  14. #34
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par NairodDorian Voir le message
    Tu vis dans un autre monde si tu crois que c'est la fonction qui doit te torché les fesses pcq t'as fais de travers.
    C'est quoi faire de travers? Utiliser des doubles plus grands que INT_MAX, vouloir formater un entier qui vaut INT_MIN ou désirer que ce formatage soit correctement arrondi?

  15. #35
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Bon, la discussion peut très bien continuer longtemps comme ca...

    @NairodDorian

    En relisant le topic, on peut voir que la fonction que tu pouvais en coder 'en 1 minute" :
    • a pris plus qu'une 1 minute à écrire à moins que tu n'écrives 20 mots à la seconde
    • tu a du poster plusieurs exemplaires du code
    • ce code est toujours pas exploitable car entre autre il ne gère pas toute les valeurs possible d'un double...
    Donc, au final, au risque de me répéter, ce genre de fonction ne se code pas en "1 minute" car le temps total comprends la conception, le codage, les tests, les corrections, tuning...
    Cela sachant que cela doit tourner sans faille sur un micro-controleur (donc faire des tests ultra complets, donc du temps....)
    Au final le temps pour coder ce genre de fonction n'est pas 'quelque minutes'
    ET cela n'a rien à voir avec la complexité de la fonction...
    Du code de qualité prends toujours du temps à produire.

    Tout çà pour dire que arriver dans un topic et dire :

    "Fais le à main, il ne faut que quelque minutes...", ben c'est archi faux pour un développeur consciencieux...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  16. #36
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    "Fais le à main, il ne faut que quelque minutes...", ben c'est archi faux pour un développeur consciencieux...
    Hmm. Ça dépend. Une minute, c'est exagéré, bien sûr, mais ce n'est pas pour autant que ça ne vaut pas le coup, parfois, de faire ce genre de fonctions de conversion soi-même. Et là, encore, on parle d'un double, mais alors sur les int, ça peut devenir des oneliners.

    L'exercice en lui-même est très intéressant d'ailleurs.

Discussions similaires

  1. convertir un tableau de char en double
    Par joffrey575 dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2015, 09h25
  2. Convertir un double ou float en *char
    Par Nono Sto dans le forum Langage
    Réponses: 7
    Dernier message: 12/04/2010, 09h18
  3. convertir un Double en integer
    Par amelhog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 17/08/2005, 09h08
  4. Convertir un TStrings en char
    Par syphicoque dans le forum C++Builder
    Réponses: 11
    Dernier message: 04/04/2004, 22h59
  5. Réponses: 3
    Dernier message: 02/07/2003, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo