1

Salut,

Bon voilà je me rends compte que j'ai besoin d'utiliser des nombres à virgule flottante
Donc je reprends des posts dans le topic "GTC prob type float" :
Zephyr (./55) :
C'est juste une convention, tu vas utiliser des entiers pour représenter des valeurs décimales, donc à toi de choisir combien de bits tu vas utiliser pour ta partie entière et ta partie décimale et d'effectuer les divisions au bon moment.

Pour être plus parlant, mettons que tu veux avoir deux coordonnées X et Y pour un objet, et tu veux que ces coordonnées soient des nombres décimaux. Tu peux par exemple dédier 3 bits pour la partie flottante (ce qui te fait une précision à 1/3^2 = 1/8 = 0.125 près, c'est pas top mais ça dépend pour quoi). Tu fais grosso modo tous tes calculs sans te soucier de ça, mais au moment d'afficher ton objet à l'écran par exemple, tu divises tes valeurs par 8 (= tu décales de 3 bits, c'est plus rapide) pour récupérer ce qui correspond à la partie entière dans ta représentation. De la même façon tu peux isoler les 3 derniers bits pour obtenir l'équivalent de la partie "après la virgule" de ta représentation.

Pour un pseudo-exemple de code, faute d'imagination voilà ce que ça pourrait donner :
/* Je choisis de réserver 3 bits pour ma partie décimale */

x = 5 << 3; /* Je veux fixer x à 5.0, dans ma représentation il faut multiplier
par 3^2 : une valeur de 5 serait en fait équivalente dans ma représentation à
5 / 3^2 soit 0.625. */

y = 12 << 3; /* Idem */

while (53)
{
x += 1; /* Si l'on prend en compte le sens de ma représentation, ici je
n'ajoute pas 1 à x mais 1/3^2 donc "l'équivalent" de 0.125. Si j'avais
voulu ajouter 1, il aurait fallu ajouter 1 * 3^2 donc 8. */


putPixel (x >> 3, y >> 3); /* Je veux les parties entières de mes nombres
qui sont dans une représentation particulière, on dégage donc les 3 derniers
bits qui correspondent à la partie décimale. */
}

[edit] Le résultat de ce bout de code serait que le pixel n'est visiblement déplacé qu'une fois tous les 8 tours de boucle. Tel quel ça n'a pas beaucoup d'interêt, mais par exemple dans un jeu ça peut permettre des écarts de vitesse bien plus fins (8 fois) qu'entre "mon objet se déplace de 1 en 1 pixels" et "mon objet se déplace de 2 en 2 pixels"; ici tu peux avoir un mobile qui se déplace en moyenne de 1.625 pixels par boucle, par exemple.


et
Brunni (./57) :
tama (./54) :
je comprends pas sorry
pourquoi faut diviser le nombre par 2^k ?

tu pourrais pas mettre un petit bout de code très rapide pour que j'y comprenne quelque chose ? ^^

En base 100, si tu as 350:
* 350 / 100 = 3 (division entière)
* 350 % 100 = 50 (% = modulo = reste de la division de 350 par 100)
Donc ça marche bien, par contre la division est très lente, et le modulo aussi. C'est pour ça qu'ils te proposent d'utiliser des décalages de bits.
Par exemple si tu prends le nombre 8 ça donne en binaire 1000. Si tu le décales d'un bit vers la droite ça donne 100, ce qui est 4. Ca réalise donc bien une division par 2 (pour chaque décalage), et c'est bcp plus rapide (plus facile de décaler les bits que faire une division, à la main aussi d'ailleurs). Mais comme on ne peut pas réaliser une division de 100 avec des puissances de 2 (2, 4, 8, ..., 64, 128, 256, ...), on choisit une autre valeur, par exemple 256 (ou plus ou moins selon la précision dont tu as besoin).
Pour le modulo on a le "AND" bit à bit, avec un masque qui ne garde que les derniers bits. Exemple:
* 3.5: 3 * 256 + 0.5 * 256 = 896 (0x380 en hexa)
* 896 >> 8 = 896 / 256 = 3 (division entière)
* 896 & 255 = 896 % 256 = 128
128 est la moitié de la base (256) donc ça donne bien 3.5 smile

[Edit] Réellement désolé Zephyr, j'ai complètement zappé ton message sorry (et une demie heure de perdue, une)



Maintenant le problème c'est, si par exemple je reprends ce que Brunni a dit et que je veux afficher 3.5 comment je passe de 128 à .5 ?
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

2

ben 128/256 ... mais le programme ne connaitra pas .5; seulement 128!

la virgule fixe, ça sert dans les calculs intermédiaires, mais à la conversion, t'obtiendras seulement un entier smile, donc zéro dans ce cas!

3

et si j'interprétais 0.5 comme 5000 (*10^4)
comme 1 unité représente 1/2^8 soit environ 0.00391 que je peux prendre comme 39
Comme ça 128 ça serait 0.4992 qui serait affiché
Le problème c'est que je perds en précision

Sinon reste toujours la solution de faire une table, mais une table de 256 valeurs c'est pas terrible...=s
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

4

sprintf("%d.%03d",x>>8,(x&255)*125>>(8-3))
(si x est positif)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

5

6

ça marche pas avec GTC ^^

EDIT : le code

#include <stdio.h>

void _main()
{
   short x=159;
   sprintf("%d.%03d",x>>8,(x&255)*125>>(8-3));
   ngetchx();
}


=> Warning (ligne 6, c'est à dire la ligne du sprintf(...) : cast from short to pointer is dangerous
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

7

euh pardon, printf et pas sprintf ^^ (ou alors il faut rajouter un buffer en paramètre)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

8

ok c'est bon smile
mais ça serait possible d'expliquer la fin :
(x&255)*125>>(8-3) ?
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

9

- la partie fractionnaire de x est xfrac = (float)(x%256)/256
- on veut calculer xfrac1000 = (int)(xfrac*1000)
- on veut éviter d'utiliser les float : donc on fait passer la multiplication avant la division pour que la division ne supprime pas d'information utile
- ça donne xfrac1000 = ((x%256)*1000)/256
- seulement y a un gros risque d'overflow quand on multiplie par 1000 : x%256 peut valoir jusqu'à 255, donc l'idéal ce serait de multiplier par un nombre plus petit que 256, comme ça on a juste une multiplication 16 bits
- coup de bol 1000 = 8*125, et 8 est une puissance de 2
- donc on peut écrire xfrac1000 = ((x%256)*125*8)/256 = ((x%256)*125<<3)>>8
- et on peut éliminer l'overflow en transformant le décalage à gauche par 3 puis à droite par 8 en un seul décalage à droite par 8-3
- finalement xfrac1000 = (x%256)*125>>(8-3)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

10

À titre d'information, TIGCC donne aussi ce warning, plus un autre (qui vient de -Wwrite-strings, pas le droit de passer une chaîne constante en tant que buffer):
/tmp/ktigcc6zOgle/New File.c:42: warning: passing argument 1 of '(<U6160> = *(*200u + 332u))' discards qualifiers from pointer target type
/tmp/ktigcc6zOgle/New File.c:42: warning: passing argument 2 of '(<U6160> = *(*200u + 332u))' makes pointer from integer without a cast


Et sinon, ngetchx n'est pas dans stdio.h. Il faut rajouter kbd.h ou utiliser tigcclib.h.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

11

Kevin Kofler (./10) :

Et sinon, ngetchx n'est pas dans stdio.h. Il faut rajouter kbd.h ou utiliser tigcclib.h.


woops c'est vrai ^^
Pollux (./9) :
- la partie fractionnaire de x est xfrac = (float)(x%256)/256
- on veut calculer xfrac1000 = (int)(xfrac*1000)
- on veut éviter d'utiliser les float : donc on fait passer la multiplication avant la division pour que la division ne supprime pas d'information utile
- ça donne xfrac1000 = ((x%256)*1000)/256
- seulement y a un gros risque d'overflow quand on multiplie par 1000 : x%256 peut valoir jusqu'à 255, donc l'idéal ce serait de multiplier par un nombre plus petit que 256, comme ça on a juste une multiplication 16 bits
- coup de bol 1000 = 8*125, et 8 est une puissance de 2
- donc on peut écrire xfrac1000 = ((x%256)*125*8)/256 = ((x%256)*125<<3)>>8
- et on peut éliminer l'overflow en transformant le décalage à gauche par 3 puis à droite par 8 en un seul décalage à droite par 8-3
- finalement xfrac1000 = (x%256)*125>>(8-3)


compris, mais si on utilise autre chose que 256, ça serait différent
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

12

non, il faut juste changer le 255 et le 8...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

13

ok
et sinon un tout autre problème : pour fgets

on peut s'en servir pour récupérer des saisies (d'après un tuto que j'ai lu) mais pour le paramètre FILE faut mettre quoi ?

à moins que le C sur PC et le C sur TI sont différents...
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

14

oui il n'y a pas de stdin/stdout sur TI

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

15

Il y a un getsn qui est l'équivalent de fgets(stdin (c'est-à-dire gets avec taille maximale spécifiée) dans la dernière TIGCCLIB, en revanche le fork obsolète dans GTC ne l'a à ma connaissance pas.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

16

pas de getsn() dans GTC oncalc effectivement
Et c'est pas possible de faire une saisie "sécurisée" dans ce cas ?
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

17

Tu aimes bien le mot "obsolète" toi. Encore une fois, avant de critiquer le travail des autres, remets le tien en question (TIEmu qui plante de partout, TIGCC 0.95 mis en avant sur ton site, absence de news sur mobifiles.de alors que tu te vantes ici d'avoir le statut de rédacteur, etc).
Merci.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

18

ou sinon faudra écrire ma propre fonction, je crois qu'il y a des exemples ^^
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

19

Thibaut (./17) :
Tu aimes bien le mot "obsolète" toi.

C'est un fork de TIGCCLIB de TIGCC 0.94 Beta 18, pratiquement pas mis à jour (il a remplacé gray.s par une version plus récente et ça m'a l'air d'être tout ce qu'il a changé depuis tout ce temps), il manque donc toutes les nouvelles fonctions introduites depuis.
TIEmu qui plante de partout

Tu exagères. Il y a quelques bogues dans l'intégration TiEmu<->GDB, mais de là à dire que ça plante "de partout".
TIGCC 0.95 mis en avant sur ton site

J'ai expliqué les raisons pour lesquelles c'est comme ça, et ça va bientôt se résoudre avec le nouveau système de versions.
absence de news sur mobifiles.de alors que tu te vantes ici d'avoir le statut de rédacteur

Je n'y peux rien s'il ne se passe rien qui mériterait une news.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

20

[HS total]

Pourtant il se passe des choses que plein d'utilisateurs seraient heureux d'apprendre. Mais t'as toujours fait passer ton avis avant celui des autres, on te changera pas là-dessus roll

Pour GTC, tu excuseras Pollux d'avoir d'autres choses à faire que GTC dans sa vie. Il est déjà super sympa d'avoir produit un outil aussi complet et fonctionnel.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

21

bon faut le faire avec getc/getchar c'est bon smile
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

22

oui, voila smile

pense à vérifier que tu ne lis pas plus de caractères que la taille de ton tableau de stockage smile

23

Pollux : ce serait compliqué d'intégrer la technique que tu expliques à GTC afin d'"émuler" le type float ? Ce serait mieux que rien je trouve.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.