- Fichier decimaldev.lua.
Code : Tout sélectionner
function divmod(a,b) local q = 0 local r = a while not (r < b) do q = q+1 r = r-b end return q,r end function contains(list,x) for k,v in pairs(list) do if v == x then return true end end return false end function index(list,x) for k,v in pairs(list) do if v == x then return k end end end function display(list,i) local a = '' local b = '' for k,v in pairs(list) do if k < i then a = a .. v else b = b .. v end end if b == '0' then return string.format([[\num{%s}]],a) else return string.format([[\num[retain-explicit-decimal-marker]{%s}\underline{%s}]],a,b) end end function decimaldev(a,b) local s = a*b < 0 and '-' or '' local q,r = divmod(math.abs(a),math.abs(b)) local qlist = {s,tostring(q),'.'} local rlist = {} while not contains(rlist,r) do table.insert(rlist,r) q,r = divmod(r*10,math.abs(b)) table.insert(qlist,tostring(q)) end return display(qlist,index(rlist,r)+3) end
- Exemple de fichier tex.
Code : Tout sélectionner
\documentclass{article} \usepackage[output-decimal-marker={,}]{siunitx} \directlua{dofile('decimaldev.lua')} \newcommand{\decimaldev}[2]{\directlua{tex.sprint(decimaldev(#1,#2))}} \begin{document} \begin{itemize} \item \decimaldev{123}{14} \item \decimaldev{5}{2} \item \decimaldev{6}{2} \item \decimaldev{5}{3} \end{itemize} \end{document}
- Résultat obtenu après compilation lualatex.
[Lualatex] Développement décimal propre d'une fraction
-
- Administrateur
- Messages : 8058
- Inscription : samedi 28 mai 2005, 14:23
- Statut actuel : Enseignant
- Contact :
[Lualatex] Développement décimal propre d'une fraction
Voici un exemple permettant d'obtenir le développement décimal propre d'une fraction, avec la notation soulignée.
Re: [lualatex] Exemples d'utilisation
Merci pour le partage. C'est pillable ?
-
- Administrateur
- Messages : 8058
- Inscription : samedi 28 mai 2005, 14:23
- Statut actuel : Enseignant
- Contact :
Re: [lualatex] Exemples d'utilisation
Pas de problème, chacun en fait ce qu'il en veut.
-
- Utilisateur éprouvé
- Messages : 995
- Inscription : vendredi 12 juin 2009, 22:35
- Statut actuel : Enseignant
- Localisation : Chambéry
- Contact :
Re: [Lualatex] Développement décimal propre d'une fraction
Je mets l'exacte traduction de cet algorithme simple d'arithmétique en TeX.
Il est cependant un peu corrigé, car il n'a pas le bug que possède celui de lua et est bien plus efficace pour l’algorithme de la division euclidienne :
Il est cependant un peu corrigé, car il n'a pas le bug que possède celui de lua et est bien plus efficace pour l’algorithme de la division euclidienne :
Code : Tout sélectionner
\documentclass{article}
\catcode`\_11
\newcount\div_cnt
\newcount\divmod_cnt
\def\math_abs#1{\numexpr\ifnum#1<0-\fi#1\relax}
\def\math_sgn#1#2{\numexpr\ifnum#1<0-\fi\ifnum#2<0-\fi1\relax}
\def\math_divmod#1,#2=#3/#4;{%
\divmod_cnt\numexpr#3\relax \divide\divmod_cnt\numexpr#4\relax
\edef#1{\number\divmod_cnt}\edef#2{\number\numexpr#3-#1*#4\relax}%
}
\def\add_tomacro#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\xadd_tomacro#1#2{\expandafter\add_tomacro\expandafter#1\expandafter{\expanded{#2}}}
\def\decdiv#1#2{%
\begingroup
\edef\div_q{\number\math_abs{#2}}%
\math_divmod \int_result,\current_r = \math_abs{#1}/\div_q;%
\edef\int_result{\ifnum\math_sgn{#1}{#2}=-1-\fi\int_result}%
\ifnum\current_r>0 \add_tomacro\int_result{{,}}\fi
\div_cnt0 \let\div_qlist\empty \def\div_rlist{,}%
\loop
\expandafter\find_index\expanded{{\div_rlist}{\current_r}}\r_index
\ifnum\r_index=-1
\advance\div_cnt1
\xadd_tomacro\div_rlist{\current_r:\number\div_cnt,}%
\math_divmod \current_q,\current_r=\current_r0/\div_q;%
\xadd_tomacro\div_qlist{\current_q,}%
\repeat
\div_cnt1 \def\sum_decpartb{0}\let\dec_parta\empty \let\dec_partb\empty
\loop
\unless\ifx\div_qlist\empty
\peek_digit\div_qlist\current_digit
\ifnum\div_cnt<\r_index
\xadd_tomacro\dec_parta\current_digit
\else
\xadd_tomacro\dec_partb\current_digit
\xadd_tomacro\sum_decpartb{+\current_digit}%
\fi
\advance\div_cnt1
\repeat
\ensuremath{\int_result\dec_parta\ifnum\numexpr\sum_decpartb>0 \underline{\dec_partb}\fi}%
\endgroup
}
\def\find_index#1#2#3{%
\def\find_indexa##1,#2:##2,##3\_nil{\def#3{##2}}%
\find_indexa#1#2:-1,\_nil
}
\def\peek_digit#1#2{%
\ifx\empty#1%
\def#2{-1}%
\else
\expandafter\peek_digita#1\_nil#1#2%
\fi
}
\def\peek_digita#1,#2\_nil#3#4{\def#3{#2}\def#4{#1}}
\catcode`\_8
\begin{document}
\decdiv{123}{14}
\decdiv{5}{2}
\decdiv{6}{2}
\decdiv{47}{29}
\decdiv{2000000000}{3}
\end{document}
Programmer en TeX, TeXpérimental
-
- Administrateur
- Messages : 8058
- Inscription : samedi 28 mai 2005, 14:23
- Statut actuel : Enseignant
- Contact :
Re: [Lualatex] Développement décimal propre d'une fraction
Merci pour cette version TeX.
Sinon, on parle de quel bug concernant la version Lua ?
Sinon, on parle de quel bug concernant la version Lua ?
Re: [Lualatex] Développement décimal propre d'une fraction
Division avec des entiers ?
-
- Administrateur
- Messages : 8058
- Inscription : samedi 28 mai 2005, 14:23
- Statut actuel : Enseignant
- Contact :
Re: [Lualatex] Développement décimal propre d'une fraction
Tu peux préciser ? Car là je ne vois toujours pas ce dont il est question.
-
- Utilisateur éprouvé
- Messages : 995
- Inscription : vendredi 12 juin 2009, 22:35
- Statut actuel : Enseignant
- Localisation : Chambéry
- Contact :
Re: [Lualatex] Développement décimal propre d'une fraction
Il y a 2 bugs qui sont mis en évidence par les exemples que j'ai rajoutés :
- celui de la division euclidienne par soustractions. Qui est une folie pour 2000000000/3, même si lua « est rapide ».
- celui qui plante avec les grands entiers. Essayez 47/29.
Programmer en TeX, TeXpérimental
Re: [Lualatex] Développement décimal propre d'une fraction
Qu'entends-tu comme souci avec 47/29 ? Pour ma part, j'ai la même période qu'avec https://www.wolframalpha.com/input?i=47%2F29 .
-
- Utilisateur éprouvé
- Messages : 995
- Inscription : vendredi 12 juin 2009, 22:35
- Statut actuel : Enseignant
- Localisation : Chambéry
- Contact :
Re: [Lualatex] Développement décimal propre d'une fraction
Ah oui...
Je sais plus ce que j'avais fait du coup. D'ici à ce qu'un de mes scripts lua plante et non celui donné ici, il n'y a qu'un pas.
Comme j'avais constaté le bug il y a plusieurs jours, je me rappelle plus du tout ce que j'avais bien pu bidouiller.
Je sais plus ce que j'avais fait du coup. D'ici à ce qu'un de mes scripts lua plante et non celui donné ici, il n'y a qu'un pas.
Comme j'avais constaté le bug il y a plusieurs jours, je me rappelle plus du tout ce que j'avais bien pu bidouiller.
Programmer en TeX, TeXpérimental
-
- Sujets similaires
- Réponses
- Vues
- Dernier message