Page 1 sur 1

[luacode] Boucle for et arrondi

MessagePosté: Mercredi 25 Juin 2014, 16:04
par raphkebab
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}

Re: [luacode] Boucle for et arrondi

MessagePosté: Mercredi 25 Juin 2014, 20:48
par OG
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.

Re: [luacode] Boucle for et arrondi

MessagePosté: Jeudi 26 Juin 2014, 01:29
par raphkebab
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).

Re: [luacode] Boucle for et arrondi

MessagePosté: Jeudi 26 Juin 2014, 09:25
par OG
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.

Re: [luacode] Boucle for et arrondi

MessagePosté: Jeudi 26 Juin 2014, 10:06
par raphkebab
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}

Re: [luacode] Boucle for et arrondi

MessagePosté: Jeudi 26 Juin 2014, 10:23
par OG
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.