π
<-

[ndless] printf et nombres flottants

C, C++, ASM...

[ndless] printf et nombres flottants

Unread postby totorigolo » 22 Apr 2013, 16:55

Salut à tous,

J'essaie en ce moment même de programmer un petit truc pour Nspire, et je me suis rendu compte que l'affichage des floats avec printf marche vraiment mal.

J'ai fait un code minimal que voici :
Code: Select all
#include <os.h>

int main()
{
    float timeStep = 1.f / 60.f;
    printf("Timestep = %5.4f\n", timeStep);

    float time;
    for (time = 0.f; time < 2.f; time += timeStep)
    {
        printf("Time is (%d) %5.4f\n", (int) time * 8.f, time);
    }

    return 0;
}


Et la sortie est très exotique...
Show/Hide spoilerAfficher/Masquer le spoiler
Timestep = 0.0000
Time is 0.0000
Time is 0.0000
Time is 0.0000
Time is -2.0000
Time is 0.0000
Time is 268156222240899000000000000000000000000000000000000000000000000000000000
000000
Time is -0.0000
Time is -26815622227419760000000000000000000000000000000000000000000000000000000
0000000
Time is 0.0000
Time is 2.0000
Time is 268156222303333800000000000000000000000000000000000000000000000000000000
000000
Time is -0.0000
Time is -0.0000
Time is -2.0000
Time is -26815622233663250000000000000000000000000000000000000000000000000000000
0000000
Time is 0.0000
Time is 0.0000
Time is 2.0000
Time is 268156222357444200000000000000000000000000000000000000000000000000000000
000000
Time is -0.0000
Time is -0.0000
Time is -2.0000
Time is -26815622237409360000000000000000000000000000000000000000000000000000000
0000000
Time is 0.0000
Time is 0.0000
Time is 2.0000
Time is 268156222390742900000000000000000000000000000000000000000000000000000000
000000
Time is -0.0000
Time is -0.0000
Time is -2.0000
Time is 268156222407392200000000000000000000000000000000000000000000000000000000
000000
Time is -26815622240947340000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222411554600000000000000000000000000000000000000000000000000000000
000000
Time is -26815622241363570000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222415716800000000000000000000000000000000000000000000000000000000
000000
Time is -26815622241779800000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222419879300000000000000000000000000000000000000000000000000000000
000000
Time is -26815622242196040000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222424041600000000000000000000000000000000000000000000000000000000
000000
Time is -26815622242612270000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222428203900000000000000000000000000000000000000000000000000000000
000000
Time is -26815622243028500000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222432366200000000000000000000000000000000000000000000000000000000
000000
Time is -26815622243444730000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222436528500000000000000000000000000000000000000000000000000000000
000000
Time is -26815622243860960000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222440690900000000000000000000000000000000000000000000000000000000
000000
Time is -26815622244277200000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222444853200000000000000000000000000000000000000000000000000000000
000000
Time is -26815622244693440000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222449015500000000000000000000000000000000000000000000000000000000
000000
Time is -26815622245109670000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222453177900000000000000000000000000000000000000000000000000000000
000000
Time is -26815622245525900000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222457340200000000000000000000000000000000000000000000000000000000
000000
Time is -26815622245942130000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222461502400000000000000000000000000000000000000000000000000000000
000000
Time is -26815622246358360000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222465664800000000000000000000000000000000000000000000000000000000
000000
Time is -26815622246774600000000000000000000000000000000000000000000000000000000
0000000
Time is 268156222469827200000000000000000000000000000000000000000000000000000000
000000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000
Time is 0.0000
Time is 2.0000
Time is -0.0000
Time is -2.0000


Néanmoins, il me semble que seul l'affichage s'excite, le reste fonctionne très bien (dans mon code complet).

Je ne sais pas si il s'agit d'une limitation de ndless ou d'une erreur de ma part. Je précise que la sortie est la même en compilant sous Windows et Linux.
Mon Makefile est le suivant :
Show/Hide spoilerAfficher/Masquer le spoiler
Code: Select all
GCCFLAGS = -O3
LDFLAGS = -L
GCC = nspire-gcc
LD = nspire-ld
OBJCOPY := "$(shell (which arm-elf-objcopy arm-none-eabi-objcopy arm-linux-gnueabi-objcopy | head -1) 2>/dev/null)"
ifeq (${OBJCOPY},"")
   OBJCOPY := arm-none-eabi-objcopy
endif
OBJS = main.o
DISTDIR = bin/
vpath %.tns $(DISTDIR)

all: test.tns

%.o: %.c
   $(GCC) $(GCCFLAGS) -c $<

%.o: %.S
   $(GCC) $(GCCFLAGS) -c $<

test.tns: $(OBJS)
   $(LD) $(LDFLAGS) $^ -o $(@:.tns=.elf)
   @mkdir -p $(DISTDIR)
   $(OBJCOPY) -O binary $(@:.tns=.elf) $(DISTDIR)/$@

clean:
   rm -f *.o *.elf
   rm -f $(DISTDIR)/test.tns

call: clean all


Si vous avez des infos, je suis donc preneur :)

totorigolo
nRGBlib, bibliothèque graphique en couleurs pour Ndless 3 !
pdf2png, un convertisseur de pdf en png, conçu pour être utilisé avec mViewer CX !
Image
User avatar
totorigolo
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 42.3%
 
Posts: 132
Joined: 14 Sep 2011, 20:30
Gender: Male
Calculator(s):
MyCalcs profile
Class: Département Informatique - INSA de Lyon

Re: [ndless] printf et nombres flottants

Unread postby Levak » 22 Apr 2013, 17:25

Remplace
Code: Select all
(int) time * 8.f

Par
Code: Select all
(int)( time * 8.f)

D'ailleurs, dans ton printf, tu as une paire de parenthèses autour de %d que je ne vois pas dans ta sortie.. ?
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: [ndless] printf et nombres flottants

Unread postby totorigolo » 22 Apr 2013, 17:52

Levak wrote:D'ailleurs, dans ton printf, tu as une paire de parenthèses autour de %d que je ne vois pas dans ta sortie.. ?


Normal, j'ai modifié le code et remplacé la sortie dans le post en oubliant de changer le code. C'était juste un test : sans le * 8f, ça donne 0 puis 1 (normal), avec ça sort des trucs chelous.
Code: Select all
printf("Time is %5.4f\n", time);
nRGBlib, bibliothèque graphique en couleurs pour Ndless 3 !
pdf2png, un convertisseur de pdf en png, conçu pour être utilisé avec mViewer CX !
Image
User avatar
totorigolo
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 42.3%
 
Posts: 132
Joined: 14 Sep 2011, 20:30
Gender: Male
Calculator(s):
MyCalcs profile
Class: Département Informatique - INSA de Lyon

Re: [ndless] printf et nombres flottants

Unread postby Lepzulnag » 22 Apr 2013, 19:31

J'ai déjà expérimenté ces problèmes, et n'avait trouvé malheureusement aucune solution. Soit le %f est mal supporté par printf et sprintf, soit ce sont les flottants eux-même qui ne sont pas supportés.
User avatar
Lepzulnag
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 78.5%
 
Posts: 151
Joined: 02 Aug 2012, 21:15
Location: Bretagne
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: M2 Maths

Re: [ndless] printf et nombres flottants

Unread postby totorigolo » 22 Apr 2013, 19:51

J'en ai conclu que c'est le %f qui est mal supporté, parce que quand on s'en sert pour des opérations et qu'on utilise le résultat, il est bon.
nRGBlib, bibliothèque graphique en couleurs pour Ndless 3 !
pdf2png, un convertisseur de pdf en png, conçu pour être utilisé avec mViewer CX !
Image
User avatar
totorigolo
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Level up: 42.3%
 
Posts: 132
Joined: 14 Sep 2011, 20:30
Gender: Male
Calculator(s):
MyCalcs profile
Class: Département Informatique - INSA de Lyon

Re: [ndless] printf et nombres flottants

Unread postby Levak » 22 Apr 2013, 19:52

Ça me fait penser à un hack que bsl a fait pour pouvoir gérer les doubles avec scanf : il fallait lire en little endian les deux octets (donc les inverser) car yagorto et le compilateur de TI ne suivent pas la même écriture en mémoire... peut-être chercher à faire un byte swap avant d'afficher ?
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: [ndless] printf et nombres flottants

Unread postby Excale » 22 Apr 2013, 19:53

Yagarto :).
(ou Yaourt pour les intimes)
User avatar
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 3.9%
 
Posts: 2955
Images: 3
Joined: 10 Sep 2010, 00:00
Gender: Male
Calculator(s):
MyCalcs profile

Re: [ndless] printf et nombres flottants

Unread postby Lepzulnag » 23 Apr 2013, 12:31

Levak wrote:Ça me fait penser à un hack que bsl a fait pour pouvoir gérer les doubles avec scanf : il fallait lire en little endian les deux octets (donc les inverser) car yagorto et le compilateur de TI ne suivent pas la même écriture en mémoire... peut-être chercher à faire un byte swap avant d'afficher ?


Qu'est-ce que tu entends par les deux octets ? Les deux premiers octets ?

J'ai tenté de lire à l'envers les 4 octets d'un flottant ou les 8 octets d'un double mais cela affiche tout de même des résultats incohérents.
User avatar
Lepzulnag
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 78.5%
 
Posts: 151
Joined: 02 Aug 2012, 21:15
Location: Bretagne
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: M2 Maths


Return to Native: Ndless, Linux, ...

Who is online

Users browsing this forum: ClaudeBot [spider] and 4 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1522 utilisateurs:
>1507 invités
>7 membres
>8 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)