[luacode] Boucle for et arrondi

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

[luacode] Boucle for et arrondi

Messagepar raphkebab » Mercredi 25 Juin 2014, 16:04

Bonjour,

Je dessinais avec tikz pour m'exercer au lua. Et j'ai eu un message d'erreur me disant que j'utilisai des distances qui dépassaient la capacité stockage de tikz. Je me suis penché sur la question et je me suis aperçu que lua donnait parfois des valeurs approchées sans que le nombre n'est x chiffres après la virgule. A un moment la boucle for c'est arrêté une occurrence avant la fin.

Je voulais savoir si vous aviez les mêmes erreurs ou si c'est mon compilateur.

Code: Tout sélectionner
\documentclass{article}
\usepackage{luacode}
\usepackage{fontspec}
\usepackage{tikz}
\begin{document}

\begin{luacode*}
function f1()
   for x=-2,0,0.1 do
   tex.print("\\fill[color=green](".. x .."," .. 2*x ..")circle (1pt);")
   end
end

function f2()
   for x=-1,0,0.1 do
   tex.print("\\fill(".. x+4 .."," .. 2*x ..")circle (1pt);")
   end
end

function f1bis()
   for x=-2,0,0.1 do
   tex.print("(".. x .."," .. 2*x ..")\\\\")
   end
end

function f2bis()
   for x=-1,0,0.1 do
   tex.print("(".. x .."," .. 2*x ..")\\\\")
   end
end
\end{luacode*}
\begin{tikzpicture}[yscale=1.5,xscale=1.5]
\draw (-2,0)--(5,0);
\draw[color=red] (0,0) node[above right]{~~O\_o Où est-tu petit point ?} circle(0.2);
\draw[color=red] (4,0) circle(0.2);
\directlua{f1()}
\directlua{f2()}
\end{tikzpicture}

Points de f1 :\\
\directlua{f1bis()}
Je sais bien que 1=0.9\underline{9}... mais je ne voie nul par le moment où lua a pu faire 1/3*3.\\


Points de f2 :\\
\directlua{f2bis()}
Et là bravo, il a explosé la capacité de stockage de tikz avec un nombre qui normalement se stocke avec un bit. Dit moi mon petit lua qui \underline{était} ton prof de maths ? è\_é
\end{document}
raphkebab
Kilo-utilisateur
 
Messages: 227
Inscription: Mardi 31 Décembre 2013, 12:37
Localisation: Caen
Statut actuel: Post-bac | Doctorat

Publicité

Re: [luacode] Boucle for et arrondi

Messagepar OG » Mercredi 25 Juin 2014, 20:48

Bonsoir

Je ne connais pas lua, j'obtiens le fichier pdf ci-joint.
Par contre le phénomène décrit n'est pas étonnant. Dans le processus de la boucle
il y a tout de même des nombres à virgule même si le dernier ne l'est pas
pour un humain, il peut l'être pour la machine : le pas de la boucle 0.1 est
converti en binaire et il y a des artefacts. Classiquement on a le même genre
de phénomène en Scilab par exemple et ce type de boucle est déconseillé.

O.G.
Fichiers joints
matex52.pdf
(11.46 Kio) Téléchargé 86 fois
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [luacode] Boucle for et arrondi

Messagepar raphkebab » Jeudi 26 Juin 2014, 01:29

Bonjour,

Oui c'est du au mode de stockage mais dans mes souvenir ça arrivait avec plus de chiffres après la virgule.
Par ailleurs, normalement c'est juste une erreur d'affichage et la valeur stocké est normalement bonne.
Alors, je ne voie pas pourquoi 0 serrait mal affiché.

Dans tous les cas cela n'explique pas pourquoi la première boucle arrête avant d'afficher le points (0,0).
raphkebab
Kilo-utilisateur
 
Messages: 227
Inscription: Mardi 31 Décembre 2013, 12:37
Localisation: Caen
Statut actuel: Post-bac | Doctorat

Re: [luacode] Boucle for et arrondi

Messagepar OG » Jeudi 26 Juin 2014, 09:25

Bonjour

Peut-être n'ai je pas tout compris, mais il me semble qu'il est tout à fait normal
que la boucle s'arrête avant 0 car
Code: Tout sélectionner
print (-2+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1)
-0.099999999999999
> print (-2+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1)
6.3837823915947e-16
>

le dernier résultat est strictement positif, et par définition la boucle s'arrête jusqu'au dernier inférieur ou égal à 0.


O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [luacode] Boucle for et arrondi

Messagepar raphkebab » Jeudi 26 Juin 2014, 10:06

Oui si lua fait -0.099999999999999+0.1>0 c'est logique, mais super inquiétant, car pour le coup ce ne serait pas une erreur d'affichage, mais de stockage.

Le plus bizarre c'est qu'il calcule -0.099999999999999*2=-0.2. C'est pour ça que pour moi la valeur était stockée correctement.

Mais bon tu dois avoir raison. Dans R j'obtien :
> -2+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
[1] -0.1
> -2+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
[1] 6.383782e-16

Je ne devais plus m'en souvenir puisque j'utilise la fonction seq qui n'a pas ce problème. Je cherchais juste à faire la même chose en lua. :(
> seq(-2,0,0.1)
[1] -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0

Si je change mes boucles en parcourent des entiers que je divise il ne semble plus y avoir de problèmes.

Code: Tout sélectionner
\documentclass{article}
\usepackage{luacode}
\usepackage{fontspec}
\usepackage{tikz}
\begin{document}

\begin{luacode*}
function f1()
   for x=-20,0,1 do
   tex.print("\\fill[color=green](".. x/10 .."," .. 2*x/10 ..")circle (1pt);")
   end
end

function f1bis()
   for x=-20,0,1 do
   tex.print("(".. x/10 .."," .. 2*x/10 ..")\\\\")
   end
end
\end{luacode*}
\begin{tikzpicture}[yscale=1.5,xscale=1.5]
\draw (-2,0)--(5,0);
\directlua{f1()}
\directlua{f2()}
\end{tikzpicture}

Points de f1 :\\
\directlua{f1bis()}
\end{document}
Dernière édition par raphkebab le Jeudi 26 Juin 2014, 10:51, édité 1 fois.
raphkebab
Kilo-utilisateur
 
Messages: 227
Inscription: Mardi 31 Décembre 2013, 12:37
Localisation: Caen
Statut actuel: Post-bac | Doctorat

Re: [luacode] Boucle for et arrondi

Messagepar OG » Jeudi 26 Juin 2014, 10:23

raphkebab a écrit:Oui si lua fait -0.099999999999999+0.1>0 c'est logique, mais super inquiétant, car pour le coup ce ne serait pas une erreur d'affichage, mais de stockage.

[/code]


non ce n'est pas une erreur de stockage, c'est l'arithmétique approchée et ses artefacts.
Ce type de boucle est totalement déconseillé pour ce genre de raison (cf ma première réponse et Scilab).

O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot] et 31 invités