chiffre a virgule

controlo

New Member
Bonsoir ,

Je souhaite pouvoir utiliser un chiffre à virgule du genre 5,416523456 pour une application à base de picaxe. En premier je voudrais savoir si il est possible de le tronquer à 2 chiffres après la virgule(obtenir 5,41).Ensuite pouvez- vous m'expliquer comment utiliser la fonction BINTOASCII ( par exemple pour découper 5,41 afin de l'envoyer sur un afficheur via le picaxe)Et enfin , comment extraire le chiffre avant la virgule (ici le 5 dans 5,41)

Merci pour vos réponses
 

BESQUEUT

Senior Member
Bonsoir ,

Je souhaite pouvoir utiliser un chiffre à virgule du genre 5,416523456 pour une application à base de picaxe. En premier je voudrais savoir si il est possible de le tronquer à 2 chiffres après la virgule(obtenir 5,41).Ensuite pouvez- vous m'expliquer comment utiliser la fonction BINTOASCII ( par exemple pour découper 5,41 afin de l'envoyer sur un afficheur via le picaxe)Et enfin , comment extraire le chiffre avant la virgule (ici le 5 dans 5,41)

Merci pour vos réponses
Bonsoir, et bienvenue sur le forum en français.

Premier point : les Picaxes ne connaissent que les entiers positifs (entre 0 et 255) ou bien (entre 0 et 65535)
Mais ce n'est pas forcément un problème pour afficher des résultats avec 2 chiffres après la virgule : il suffit de faire tous les calculs en centièmes et d'ajouter la virgule au moment d'envoyer le résultat à l'afficheur.

Deuxièmement : si le but n'est pas seulement d'afficher deux chiffres après la virgule, mais de faire des calculs en virgule flottante, il existe des bibliothèques spécialisées, ou alors des processeurs externes. celà n'a un intérêt que si les ordres de grandeur des nombres à traiter varient beaucoup. Dans la très grande majorité des cas, les calculs peuvent se ramener à des nombres entiers en utilisant la bonne unité.

Troisièmement : suivant les calculs à réaliser (addition, soustraction, multiplications, divisions, trigo, logs...) certains Picaxes sont plus adaptés. En outre, différentes techniques de calcul permettent de contourner les limitation du calcul sur les entiers positifs.

Pour aller plus loin, il faudrait en savoir plus sur la nature des calculs envisagés et sur les ordres de grandeur des nombres en entrée. exemples bienvenus...

Une question me taraude : a quoi correspond cette valeur 5,416523456 et comment l'introduisez vous dans le Picaxe :
- est-ce une constante ? Une valeur analogique lue par un convertisseur CAN ? Une saisie au clavier ? Une valeur lue via un port série ? ... ?
 
Last edited:

BESQUEUT

Senior Member
En ce qui concerne bintoascii, voici un petit exemple avec votre nombre qui je l'espère vous parlera :
Code:
[color=Purple]w0[/color][color=DarkCyan]=[/color][color=Navy]54165[/color]
[color=Blue]bintoascii [/color][color=Purple]w0[/color][color=Black],[/color][color=Purple]b3[/color][color=Black],[/color][color=Purple]b4[/color][color=Black],[/color][color=Purple]b5[/color][color=Black],[/color][color=Purple]b6[/color][color=Black],[/color][color=Purple]b7[/color]
[color=Blue]sertxd ([/color][color=Purple]b3[/color][color=Black],[/color][color=Red]","[/color][color=Black],[/color][color=Purple]b4[/color][color=Black],[/color][color=Purple]b5[/color][color=Black],[/color][color=Purple]b6[/color][color=Black],[/color][color=Purple]b7[/color][color=Black],[/color][color=Blue]cr[/color][color=Black],[/color][color=Blue]lf)
sertxd ([/color][color=Black]#[/color][color=Purple]b3[/color][color=Black],[/color][color=Red]" "[/color][color=Black],#[/color][color=Purple]b4[/color][color=Black],[/color][color=Red]" "[/color][color=Black],#[/color][color=Purple]b5[/color][color=Black],[/color][color=Red]" "[/color][color=Black],#[/color][color=Purple]b6[/color][color=Black],[/color][color=Red]" "[/color][color=Black],#[/color][color=Purple]b7[/color][color=Black],[/color][color=Blue]cr[/color][color=Black],[/color][color=Blue]lf)[/color]
[color=Purple]b8[/color][color=DarkCyan]=[/color][color=Purple]b3[/color][color=DarkCyan]-[/color][color=Red]"0"[/color]
[color=Purple]b9[/color][color=DarkCyan]=[/color][color=Purple]w0[/color][color=DarkCyan]/[/color][color=Navy]10000[/color]
[color=Blue]sertxd ([/color][color=Red]"b8="[/color][color=Black],#[/color][color=Purple]b8[/color][color=Black],[/color][color=Red]" b9="[/color][color=Black], #[/color][color=Purple]b9[/color][color=Black],[/color][color=Blue]cr[/color][color=Black],[/color][color=Blue]lf)[/color]
Si vous lancez ça dans le simulateur, vous devriez obtenir :
5,4165
53 52 49 54 53
b8=5 b9=5

N'hésitez pas à poser d'autres questions si cette explication s'avère insuffisante.
 
Last edited:

controlo

New Member
Bonsoir BESQUEUT,

Merci pour votre exemple.Par contre , dans le BINTOASCII je ne comprends pas pourquoi b3,b4,b5,b6,b7 et pas b0,b1,b2,b3,b4 ?
 

BESQUEUT

Senior Member
Bonsoir BESQUEUT,
Merci pour votre exemple.Par contre , dans le BINTOASCII je ne comprends pas pourquoi b3,b4,b5,b6,b7 et pas b0,b1,b2,b3,b4 ?
Excellente question : je vous remercie de l'avoir posée...
En fait w0, c'est la même chose que b0:b1
Du coup, il vaut mieux ne pas utiliser b0 et b1 si on souhaite ré-utiliser w0...
(mais j'aurais pu utiliser b2,b3,etc...)
De plus, on n'est pas obligé de donner 5 variables si on n'a besoin que des premiers chiffres.

Tout le reste est-il bien clair ? (y compris le b8=b3-"0" qui pose souvent problème aux débutants...)

Au fait, je suis toujours taraudé par ma question du #2...
 

controlo

New Member
Question qui taraude !!

En fait je souhaite calculer ATAN 9 qui doit donner 5.1426(ect..).Je n'ai besoin que du 5.14 pour pouvoir ensuite l'afficher .Mais quand je fait W0=ATAN 9 j'obtiens w0=5 .
Si vous avez une idée - Merci de me la communiquer .
 
Last edited:

BESQUEUT

Senior Member
Question qui taraude !!

En fait je souhaite calculer ATAN 9 qui doit donner 5.1426(ect..).Je n'ai besoin que du 5.14 pour pouvoir ensuite l'afficher .Mais quand je fait W0=ATAN 9 j'obtiens w0=5 .
Si vous avez une idée - Merci de me la communiquer .
Je comprends maintenant pourquoi ça me titillais autant...
En fait votre résultat est conforme au manuel : vous obtenez un angle en degrés exprimé sous la forme d'un nombre entier positif. Voir premier point du #2.
Si vraiment vous devez afficher deux chiffres après la virgule, il y a trois options :
1) implémenter un algorithme pour calculer ATAN avec 5 chiffres significatifs. Ce sera lent et vraiment pas simple, mais ça parait possible.
2) utiliser une FPU externe. Cher et pas si facile que ça à mettre en oeuvre, mais ça marche.
3) Utiliser autre chose qu'un Picaxe...

Cela dit, 9 n'ayant qu'un seul chiffre significatif, il est très surprenant de vouloir en déduire 3.
Si ce n'est abuser de votre patience, serait-il possible de savoir d'où vient ce nombre ?
 

controlo

New Member
cher Besqueut ,

Pour l'instant le 9 provient de rien , mais dans le projet que j'ai dans la tête ce chiffre pourrait provenir d'une entrée ADC du picaxe x par un coefficient.Normalement sur une calculatrice ATAN de 0.09 donne 5.1426.
Je ne connais pas la FPU pouvez-vous m'en dire plus (comment l'utiliser avec un picaxe)
 

BESQUEUT

Senior Member
Algo pour calculer ATAN
Assez simple et n'utilise que les 4 opérations.
Mais essayez déjà de calculer x- (x^3)/3 + (x^5)/5 avec 5 chiffres significatifs sur un Picaxe...
Sachant que x<0,268 on peut multiplier x par 200 000 et rester inférieur à 65535
on calculera donc 200 000 x , on divisera par 2 au dernier moment et on ajoutera une virgule au bon endroit.
Jusque là tout va bien.
Calculons x*x. C'est sur, ça risque de dépasser 65535...
Mais heureusement, le Picaxe a prévu le coup avec l'opérateur **, voir la doc...
Bonne chance...
 
Last edited:

controlo

New Member
BESQUEUT ,

Je ne comprends pas tout et surtout pourquoi X est inférieur à 0.268.Pouvez-vous détailler vos calcul avec une valeur de X.Mon picaxe (20X2) ne prend pas les parenthèses alors que la doc dit le contraire

Merci de m'aider à comprendre !
 
Last edited:

BESQUEUT

Senior Member
BESQUEUT ,

Je ne comprends pas tout et surtout pourquoi X est inférieur à 0.268.Pouvez-vous détailler vos calcul avec une valeur de X.

Merci de m'aider à comprendre !
Euh ??? Tout est expliqué dans le lien donné en #9 à la rubrique arctan (x) et il y a un exemple juste après.
Comme déjà dit, cette solution est lente et complexe sur un Picaxe. Ne vous lancez là dedans que si vous maîtrisez bien la démarche.
J'ai donné des pistes pour donner une idée du travail à réaliser et des difficultés qui se posent. je ne peux qu'encourager votre démarche visant "à comprendre" mais je me dois de vous avertir de la difficulté de la tâche.
Cela dit, je reste disponible pour donner des explications (en français) une fois que vous aurez relu le lien donné en #9.
 

BESQUEUT

Senior Member
Pour l'instant le 9 provient de rien , mais dans le projet que j'ai dans la tête ce chiffre pourrait provenir d'une entrée ADC du picaxe x par un coefficient.Normalement sur une calculatrice ATAN de 0.09 donne 5.1426.
Je ne connais pas la FPU pouvez-vous m'en dire plus (comment l'utiliser avec un picaxe)
Ah : c'est bien ce que je pensais : votre tangente n'est connues qu'avec 3 chiffres significatifs au mieux.
Donc l'angle qui en résulte (entre 0 et 180°) ne peut être défini au mieux qu'en dixièmes de degrés. Tenter de faire mieux, en particulier le 2ième chiffre après la virgule revient à tirer un chiffre au hasard !
Si on se limite à des résultats en dixièmes de degrés, il y a sans doute moyen d'approximer ATAN de façon plus simple.
Voir en particulier Better-atan-approximations
Connaissez vous l'étendue des angles à déterminer ?

En ce qui concerne la FPU externe, il suffit de suivre le lien donné en #7. De là, il y a un autre lien vers un pdf qui détaille tout ça...
 
Last edited:

controlo

New Member
Besqueut ,

Mon picaxe (20X2) ne prend pas les parenthèses alors que la doc dit le contraire.
De plus l'étendue de l'angle que je dois mesurer est de 5° 10' à 5°30': c'est pourquoi j'ai besoin d'aller au centième en radian ( pour avoir les minutes).
Mais pour l'instant mes problèmes sont les parenthèses et l'exposant .
je suis en version 5.5.5 de LOGICATOR & mon picaxe est un 20X2

Merci de m'aider à comprendre !

Grâce a vous j'avance progressivement - Merci
 

BESQUEUT

Senior Member
Besqueut ,

Mon picaxe (20X2) ne prend pas les parenthèses alors que la doc dit le contraire.
De plus l'étendue de l'angle que je dois mesurer est de 5° 10' à 5°30': c'est pourquoi j'ai besoin d'aller au centième en radian ( pour avoir les minutes).
Mais pour l'instant mes problèmes sont les parenthèses et l'exposant .
je suis en version 5.5.5 de LOGICATOR & mon picaxe est un 20X2

Merci de m'aider à comprendre !

Grâce a vous j'avance progressivement - Merci
Attention, en # 6 vous écrivez :
ATAN 9 qui doit donner 5.1426
En fait 5.1426 est exprimé en degrés...
Euhh : si vous vous arrêtez aux centièmes de radians, vous n'aurez jamais les minutes !
Merci de clarifier ce que vous voulez afficher : des degrés ou des radians ?
Par ailleurs, avez-vous besoins de minutes ou de degrés décimaux ?


Vu la plage d'angle très réduite, il est tout à fait possible de créer une fonction ATN spécialement optimisée pour ce cas de figure.

Je n'utilise que PE6 et ne pourrai donc pas vous aider sur Logicator.
Par contre, ça n'a rien de sorcier d'utiliser directement PE6, et le forum peut vous aider.

Je serais très surpris que Logicator permette l'utilisation des parenthèses et de l'exposant, alors que PE6 ne le fait pas, mais je laisse le soin à un sachant de répondre sur ce point.
 
Last edited:

controlo

New Member
Besqueut ,


En fait c'est ATAN(9.5) ce qui donne 5.42..... en degrés => 5° 25'

Le 9.5 est égal à (2/21)*100

Donc j'ai besoin de minutes. 5.42-5=0.42*60=25' et 12 '' mais je me moque des 12''

Mais je pense que c'est compromis si on ne peut pas mettre de parenthèse et d'exposant
 
Last edited:

BESQUEUT

Senior Member
En fait c'est ATAN(9.5) ce qui donne 5.42..... en degrés => 5° 25'
Mais je pense que c'est compromis si on ne peut pas mettre de parenthèse et d'exposant
En fait dans Excel ou sur une calculatrice ATAN(0.095) donne 5,4268125°
Je ne sais pas où vous êtes allé cherché des radians, mais à part Excel, il n'y en a nul part. Donc on cause partout en degrés si vous le voulez bien. Pour ma part je ne supporte pas les notations anglo saxonnes en degrés minutes secondes. C'est pas pour rien qu'on a inventé le système décimal. Mais si ça vous amuse...

Comme expliqué un Picaxe n'utilise que des entiers positifs entre 0 et 65535
Pour contourner le problème et par convention, on multiplie les tangente par 100 et on écrit 9 au lieu de 0.095
Par exemple w0=ATAN 9 donnera 5
Notez que vous ne pouvez pas écrire w0=ATAN 9.5 car 9.5 n'est pas un nombre entier
De même le résultat ne peut pas être 5.4 ou 5.43 car ce ne sont pas des nombres entiers.

Par contre, il est possible d'écrire une fonction spéciale ATN telle que :
- au lieu de multiplier les tangentes par 100, on les multiplie par 10000; Donc 10000 est la tangente de 45°
- on multiplie les résultats par 1000. 45° sera donc représenté par la valeur 45000.
- notez que vous ne pourrez pas obtenir un résultat supérieur à 65.535° mais ça n'est pas un problème dans votre cas.
Votre exemple devient : w0=ATN 950 et le résultat sera 5427
Vous pourrez donc envoyer à votre afficheur le 5, une virgule et 2 ou 3 chiffres.
Ces derniers peuvent être directement les degrés décimaux (4 et 3)
Ou être convertis en minutes.

Pour votre exemple :
w0=20000/21 ' soit 952
w0=ATN w0 ' donnera 5438
Pour moi, j'afficherais donc 5,44 °
Mais si vous voulez vous emm***er avec des minutes, libre à vous...
 
Last edited:

controlo

New Member
Bonsoir Besqueut ,

Excusez moi mais je m&#8217;emmêle les pinceaux dans mes explications.Mais grâce a vous je pourrais peut être aboutir. Je bidouille dans le picaxe et essaye de faire quelque chose ,demain j'essaye votre exemple.

Merci et bonne soirée :eek:
 

PieM

Senior Member
Bonjour,
Vu la faible amplitude de la mesure, (de 5° à 5.5° si j'ai bien compris) pourquoi s'embêter avec un calcul d'arctang. L'approche linéaire sera suffisamment précise pour être proche du 1/100 de degré.
entre 5 et 5.5, il y a (8749-9629) soit 880 points significatifs.

de fait si la tangente est exprimée par T = tg * 10000 donc entre 875 et 964 la valeur de l'angle en 1/100 de degré sera:

Angle = T /176 * 100 + 3 (a multiplier par 3/5 pour avoir des minutes si on y tient !)

Ce qui sous picaxe peut se mettre sous la forme:
T *50/88+3
 
Last edited:

controlo

New Member
w1 = 2 * 10000 /21 w2 = w1 * 50/88 +3 équivalent à ARCTANG (2/21)

Bonsoir PIEM ,

Pouvez-vous m'expliquer comment vous êtes arrivez à cette formule : w1 = 2 * 10000 /21
w2 = w1 * 50/88 +3 équivalent à ARCTANG (2/21)


Merci
 

PieM

Senior Member
Bonsoir PIEM ,

Pouvez-vous m'expliquer comment vous êtes arrivez à cette formule : w1 = 2 * 10000 /21
w2 = w1 * 50/88 +3 équivalent à ARCTANG (2/21)


Merci
Comme indiqué, je considère que la fonction Atan est linéaire sur la portion 5° à 5.5°, soit sur une amplitude de 0.5°
La fonction Atan est donc représentée par une droite.
La variation entre tan (5.5) et tan (5) est de 0.09629 - 0.087488 soit 0.00880

la pente de la droite est donc 0.5 / 0.0088
son équation générale est de la forme ax+b
on en déduit la valeur de b
si on exprime les degrés en 1/100 ° et qu'on multiplie la valeur de la tang par 10000, on arrive a cette équation.
 
Top