Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Discussions


Index du Forum » Discussions » sprintf e float
Michele76 Hors ligne Membre Points: 4 Défis: 0 Message

sprintf e float

Posté le 04/02/2023 21:33

perdonatemi, non conosco il francese, sono italiano
ho una fx-cg50 e vorrei stampare sul display dei valori double, pensavo di riuscirci con la funzione sprintf(), ma sembra non funzionare.
Ho fatto dei test, e questi sono i risultati.
Qualcuno ha idee o consigli, o conoscono qualche funzione che riceve un double e lo ritorna come stringa?

https://imgur.com/a/AZWPEey

(google translate)
pardonnez-moi, je ne parle pas le français, je suis italien
J'ai un fx-cg50 et j'aimerais imprimer des valeurs double à l'écran, je pensais pouvoir le faire avec la fonction sprintf(), mais cela ne semble pas fonctionner.
J'ai fait quelques tests, et voici les résultats.
Quelqu'un a-t-il des idées ou des conseils, ou connaît-il une fonction qui prend un double et le renvoie sous forme de string?


Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 04/02/2023 21:40 | #


Dans le code source de libfxcg (https://github.com/Jonimoose/libfxcg), les formats pour les nombres flottants ne sont pas supportés : https://github.com/Jonimoose/libfxcg/blob/master/libc/printf.c#L271-L284

Dans la bibliothèque standard que Yatis et moi avons écrite, les formats %f, %F, %e, %E, %g et %G sont supportés (https://gitea.planet-casio.com/Vhex-Kernel-Core/fxlibc/src/branch/master/src/stdio/printf/format_fp.c). Malheureusement il serait difficile d'utiliser notre bibliothèque standard avec libfxcg, donc ce n'est pas vraiment une solution.

Une approximation toute bête serait de convertir le double en entier :

double d = 123.456;
/* Print to 6 decimal digits (only works for values near 1) */
long long i = d * 1e6;

printf("%d.%06d", i/100000, i%100000);

Mais cela ne marche que pour les valeurs ni trop grandes ni trop petites, il faut gérer les nombres négatifs, etc. Ce n'est pas très satisfaisant. >_<
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Michele76 Hors ligne Membre Points: 4 Défis: 0 Message

Citer : Posté le 04/02/2023 22:04 | #


Lephenixnoir, grazie per le informazioni, sto provando a realizzare una libreria "general purpose" per facilitarmi l' I/O di variabili nei vari formati e pensavo che per stampare un float a display sprintf() andasse bene, invece da quanto appreso non è possibile, credo allora che l'unica soluzione è sviluppare una funzione ad hoc che estrae la stringa dagli 64bit del float, smontando l' ieee754.
Un lavoraccio
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 04/02/2023 22:21 | #


C'est dur en effet ; ne le fais pas toi-même. Notre version de printf() utilise un algorithme appelé Grisu2b. Grisu2b prend un nombre flottant et indique quels sont les chiffres significatifs et l'exposant. Par exemple :

double d = 123.456;
// Grisu2b would say:
// digits = 123456
// exponent = -3

Le code de Grisu2b est libre de droits. Tu peux le récupérer dans notre libc, déjà adapté et simplifié (https://gitea.planet-casio.com/Vhex-Kernel-Core/fxlibc/src/branch/master/3rdparty/grisu2b_59_56).
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Michele76 Hors ligne Membre Points: 4 Défis: 0 Message

Citer : Posté le 04/02/2023 22:26 | #



GRAZIEEEEE!!!
MERCIIIIII
Questo semplifica il lavoro di molto

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 78 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd