J'ai récupéré la définition d'une commande qui permet par exemple de poser facilement une conversion d'un nombre décimal en nombre binaire :

\documentclass{article}

\usepackage{intcalc}
\usepackage{tikz}
\usetikzlibrary{calc}

\newcommand{\divisions}[2]{%
        % #1 = n -- #2 = base
        \begin{tikzpicture}
            \pgfmathsetmacro{\divQ}{ \intcalcDiv{#1}{#2} }
            \pgfmathsetmacro{\divR}{ \intcalcMod{#1}{#2} }

        \foreach \i in {0,...,#1} {%
            \pgfmathsetmacro{\intensite}{10*(\i+1)}

            \node                      (a\i) at (\i,   -\i)   {\ifnum\i=0$#1$\fi} ;
            \node                      (b\i) at (\i+1, -\i)   {$#2$} ;
            \node                      (q\i) at (\i+1, -\i-1) {$\divQ$} ;
            \node[fill=red!\intensite] (r\i) at (\i,   -\i-1) {$\divR$} ;

            \draw[thick] ($ (a\i)!.5!(b\i) $) -- ++(0,-1) ;
            \draw[thick] ($ (a\i)!.5!(q\i) $) -- ++(1,0) ;

            \ifnum \divQ<1
            \breakforeach
            \else
            \xdef\divR{ \intcalcMod{\divQ}{#2} };
            \xdef\divQ{ \intcalcDiv{\divQ}{#2} };
            \fi
        } % end foreach
    \end{tikzpicture}
}

\begin{document}    
\divisions{57}{2}
\end{document}

Mais existe-t-il un package qui est spécialisé dans ce genre de choses (la présentation des nombres binaires et leur manipulation) et qui soit paramétrable avec des options ?

Posée 27 Sep, 20:28

idefix's gravatar image

idefix
1.1k174451
Taux d'acceptation : 12%

Modifiée 28 Sep, 16:08

Pathe's gravatar image

Pathe ♦♦
7.7k64216262

@idefix : la commande \binary{} du package fmtcount me semble faire ça.

(27 Sep, 20:53) Pathe ♦♦ Pathe's gravatar image

Sur ConTeXt, il y a la commande lua utf.values(). Je ne sais pas si elle est accessible depuis un document LuaTeX.

(28 Sep, 09:08) sztruks sztruks's gravatar image

En utilisant le package fmtcount et sa commande \binarynum{} (\binary{} semble ne pas fonctionner) je peux afficher la conversion à côté du calcul. J'aimerai automatiser l'affichage de la conversion. Si vous avez des idées pour l'intégrer dans la commande tikz ...

    \documentclass{article}

    \usepackage{intcalc}
    \usepackage{tikz}
    \usetikzlibrary{calc}
    \usepackage{fmtcount}
    \usepackage{siunitx}
\usepackage{xintbinhex}
\sisetup{digit-group-size =4}

    \newcommand{\divisions}[2]{%
            % #1 = n -- #2 = base
            \begin{tikzpicture}
                \pgfmathsetmacro{\divQ}{ \intcalcDiv{#1}{#2} }
                \pgfmathsetmacro{\divR}{ \intcalcMod{#1}{#2} }

            \foreach \i in {0,...,#1} {%
                \pgfmathsetmacro{\intensite}{10*(\i+1)}

                \node                      (a\i) at (\i,   -\i)   {\ifnum\i=0$#1$\fi} ;
                \node                      (b\i) at (\i+1, -\i)   {$#2$} ;
                \node                      (q\i) at (\i+1, -\i-1) {$\divQ$} ;
                \node[fill=red!\intensite] (r\i) at (\i,   -\i-1) {$\divR$} ;

                \draw[thick] ($ (a\i)!.5!(b\i) $) -- ++(0,-1) ;
                \draw[thick] ($ (a\i)!.5!(q\i) $) -- ++(1,0) ;

                \ifnum \divQ<1
                \breakforeach
                \else
                \xdef\divR{ \intcalcMod{\divQ}{#2} };
                \xdef\divQ{ \intcalcDiv{\divQ}{#2} };
                \fi
            } % end foreach
        \end{tikzpicture}
    }

    \begin{document}    
    \divisions{73}{2} \hspace{1 cm} $(73)_{10}=(\binarynum{73})_2$
    \vspace{1cm}

    \divisions{73}{2} \hspace{1 cm}  $(73)_{10}=(\num{\xintdectobin{73}})_2$
    \vspace{1cm}

    \end{document}

Avec \binary{} j'obtiens le message d'erreur suivant : You can't use \relax' after \the. \binary{73}

Lien permanent

Publiée 27 Sep, 21:50

idefix's gravatar image

idefix
1.1k174451
Taux d'acceptation : 12%

Modifiée 28 Sep, 00:24

J'essaye de regrouper les chiffres binaires par 4 dans l'affichage. J'ai essayé \num{\binarynum{54}} avec siunitx, ça ne fonctionne pas

(27 Sep, 22:33) idefix idefix's gravatar image

Ca fontionne par contre avec le package xintbinhex on peut faire \num{\xintdectobin{1025}} avec \sisetup{digit-group-size =4} dans le préambule pour régler siunitx à grouper les chiffres par quatre. C'est une solution mais ca ne place pas l'affichage final dans la commande tikz

(28 Sep, 00:01) idefix idefix's gravatar image

Essayer de modifier la définition de \divisions à ...\end{tikzpicture} \hspace{1 cm} $(#1)_{10}=(\num{\xintdectobin{#1}})_{#2}$

(28 Sep, 08:23) touhami touhami's gravatar image
\documentclass{article}

\usepackage{intcalc}
\usepackage{tikz}
\usetikzlibrary{calc}

\usepackage{siunitx}
\usepackage{xintbinhex}

\sisetup{digit-group-size =4}

\newcommand{\divisions}[2]{%
    % #1 = n -- #2 = base
    \begin{tikzpicture}
        \pgfmathsetmacro{\divQ}{ \intcalcDiv{#1}{#2} }
        \pgfmathsetmacro{\divR}{ \intcalcMod{#1}{#2} }

        \foreach \i in {0,...,#1} {%
            \pgfmathsetmacro{\intensite}{10*(\i+1)}

            \node                      (a\i) at (\i,   -\i)   {\ifnum\i=0$#1$\fi} ;
            \node                      (b\i) at (\i+1, -\i)   {$#2$} ;
            \node                      (q\i) at (\i+1, -\i-1) {$\divQ$} ;
            \node[fill=red!\intensite] (r\i) at (\i,   -\i-1) {$\divR$} ;

            \draw[thick] ($ (a\i)!.5!(b\i) $) -- ++(0,-1) ;
            \draw[thick] ($ (a\i)!.5!(q\i) $) -- ++(1,0) ;

            \ifnum \divQ<1
            \node (Resultat) at (\i+4,-\i-1) {$(#1)_{10}=(\num{\xintdectobin{#1}})_{2}$};
            \breakforeach
            \else
            \xdef\divR{ \intcalcMod{\divQ}{#2} }; 
            \xdef\divQ{ \intcalcDiv{\divQ}{#2} };
            \fi
        } % end foreach

    \end{tikzpicture}
    \vspace{1 cm}
}
\begin{document}
\divisions{92}{2}\newline
\divisions{1}{2}\newline
\divisions{16383}{2}\newline
\end{document}

J'ai modifié la définition pour que la commande affiche directement le résultat à côté de l'opération. La commande n'est cohérente que pour la conversion vers le binaire alors qu'au départ elle valable pour toutes les bases (voir le second paramètre)

Lien permanent

Publiée 28 Sep, 11:10

idefix's gravatar image

idefix
1.1k174451
Taux d'acceptation : 12%

Modifiée 28 Sep, 15:05

J'ai une erreur conversion decimal binaire.tex: error: 87: Dimension too large. \divisionsbis{16384}{8} à partir de la valeur 16384. Je ne comprends pas du tout. Ca doit être une limite de TeX. Est-il possible de s'en débarasser ? (et aussi de m'expliquer ce qui se passe exactement). J'ai trouvé ce lien mais ca ne resout pas mon soucis : https://tikz.dev/pgfplots/errors

(28 Sep, 15:08) idefix idefix's gravatar image

Mmmh... j'ai du mal à suivre. Cette réponse remplace-t-elle la précédente ?

(28 Sep, 16:04) Pathe ♦♦ Pathe's gravatar image

Oui 16384 est une limite de TeX. En effet, dans une tikzpicture c'est une longueur de plus de 5 mètres.

Une solution pour contourner ce problème est de redéfinir votre commande, par exemple, comme suit:

\newcommand{\divisions}[2]{% % #1 = n -- #2 = base \def\x{\fpeval{floor((ln(16384/1024))/ln2) + 11}}%...

\foreach \i in {0,...,\x} {%

(28 Sep, 20:46) touhami touhami's gravatar image

@Pathe oui cette réponse remplace la précédente. J'ai présenté ainsi parce que pense que si j'édite la réponse initiale, on ne comprends plus rien aux commentaires qui ont permis d'élaborer la réponse finale

(04 Oct, 19:42) idefix idefix's gravatar image

@touhami. Le nombre de divisions de x par 2 nécessaires pour obtenir un quotient nul est la partie entière inférieure du logarithme binaire de x, auquel on ajoute 1

\def\x{\fpeval{floor((ln(16384))/ln2) + 1}}

Comme la boucle commence à zéro (ce qui rajoute un tour de boucle) le +1 est du à ce départ et finalement il suffit de prendre pour définir x

\def\x{\fpeval{floor((ln(16384))/ln2)}

Et on veut plutôt que ce soit le nombre de division par 2 du nombre converti (le premier paramètre de la commande) pour le cas ou il est supérieur à 16384

\def\x{\fpeval{floor((ln(#1)/ln2)}

(04 Oct, 20:21) idefix idefix's gravatar image

log2(x/1024)=log2(x/2^10)=log2(x)-log2(2^10)=log2(x)-10 et donc

log2(x/1024)+11=log2(x)-10+11=log2(x) +1 juste pour avoir une expression plus simple.

Le logarithme binaire de x log2(x) est par définition la puissance de 2 pas nécessairement entière qui donne x. Et sa partie entière indique le nombre de divisions par 2 pour obtenir un quotient égal à 1. Il faut rajouter la dernière division de 1 par 2 pour obtenir un quotient nul (+1)

Le logarithme binaire est calculé avec le logarithme népérien log2(x)=ln(x)/ln(2)

(05 Oct, 00:26) idefix idefix's gravatar image

J'aimerai mettre une option à la commande sous forme de lettres pour pouvoir choisir la position de l'écriture du résultat final. Par exemple :

bg = bas à gauche

mg = mi-hauteur à gauche

etc .. Comment peut-on indiquer une option de cette nature dans la définition de la commande ?

(05 Oct, 00:44) idefix idefix's gravatar image

Il est préférable de poser une nouvelle question.

(Il y a 2 jours) touhami touhami's gravatar image

Entendu. Juste une remarque sur cette erreur. On dirait que TikZ calcule la position de noeuds qui ne sont pas utilisés parce que le breakforeach arrête la boucle bien avant les valeurs qui posent problème à Latex. C'est un peu étrange pour moi qu'il exécute bien le breakforeach (l'affichage est normal) mais qu'il génère quand même l'erreur comme si il n'y avait pas breakforeach justement.

(Il y a 2 jours) idefix idefix's gravatar image

Comparer \foreach \i in {10,...,20} {\i} et \foreach \i in {10,...,1} {\i}. Tikz commence par évaluer la valeur initiale et la valeur finale.

(hier) touhami touhami's gravatar image
Affichage de 5 parmi 10 Afficher 5 commentaire(s) en plus
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.