Wie kann ich die Umwandlung von Dezimalzahlen in Binärzahlen veranschaulichen?

Wie kann ich die Umwandlung von Dezimalzahlen in Binärzahlen veranschaulichen?

Ich möchte eine Komma-Dezimalzahl in eine Binärzahl umwandeln, wie es der Befehl \baseexpansionin der Antwort von jfbu auf die Frage macht:

Wie kann ich die Umwandlung von Dezimal- in Binärzahlen veranschaulichen?

Ich möchte beispielsweise Zahlen wie 0,4075 in Basis boder 0,A46C in Basis umwandeln 10. Leider weiß ich nicht, wie ich das in LaTeX programmieren kann.

Hat es jemand geschafft? Xavier.

Zur genaueren Darstellung hätte ich gern das folgende Schema:Bildtabelle

und ich möchte es bei Bedarf nach p Iterationen stoppen: Bildbeschreibung hier eingeben

Wenn Sie einen besseren Algorithmus haben, der in LaTeX angezeigt werden kann, würde ich mich sehr freuen.

Vielen Dank! Sie haben großartige Arbeit geleistet!

Kann ich schließlich dasselbe für jede Basis von 2 bis 36 haben und das Ergebnis in Buchstaben ausdrücken, wie im Bild unten? Finale

Antwort1

Sie können nicht exakt von Dezimalzahlen in Binärzahlen umwandeln, da 1/5 unendlich viele Koeffizienten benötigt. (Wir können jedoch Code schreiben, um die periodische Erweiterung zu erhalten.)

Beim Wechsel von Hexadezimal zu Dezimal ist dies in verfügbar xintexpr.

Da das Ergebnis aber eine interne Notation verwendet xintfrac, verwende ich auch ein \PolDecToStringMakro von polexpr 0.4. (sehr neu, möglicherweise müssen Sie Ihre TeX-Installation aktualisieren).

\documentclass{article}
\usepackage{xintexpr}
\usepackage{xintbinhex}

\usepackage{polexpr}[2018/02/16]% Only for its \PolDecToString commodity!
\begin{document}
\PolDecToString{\xintREZ{\xinttheexpr "0.A46C\relax}}
\end{document}

Bildbeschreibung hier eingeben


Hier ist für die Umwandlung von Binär- in Dezimalzahlen

\documentclass{article}
\usepackage{xintexpr}% we could load xintfrac only, but anyhow
% polexpr loads xintexpr
\usepackage{xintbinhex}

\usepackage{polexpr}[2018/02/16]% Only for its \PolDecToString commodity!

\makeatletter
\newcommand\FracBinToDecimal[1]{\romannumeral-`0%
  % to be used on input expanding to
  % <binary digits>[.<binary digits>]
  \expandafter\FracBin@ToDecimal\romannumeral0\xintraw{#1}%
  % the above handles this abusively as if was a decimal number with
  % only 1's and 0's
}%
\def\FracBin@ToDecimal #1/#2[#3]{% something got wrong if #2 is not 1 !
  \ifnum#3<\z@
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {\PolDecToString
     {\xintREZ{\xintiiMul{\xintBinToDec{#1}}{\xintiiPow{5}{-#3}}[#3]}}%
  }%
  {\xintiiMul{\xintBinToDec{#1}}{\xintiiPow{2}{#3}}}%
}%
\makeatother

\newcommand\test[1]{\[#1_b = \FracBinToDecimal{#1}_{10}\]}

\begin{document}    
\test{11001}

\test{11001.11001}

\test{0.0001}

\test{-1111.1111}
\end{document}

Bildbeschreibung hier eingeben


Nach dem Hinzufügen der Berechnungsblätter zu OP wird das gesuchte Design angezeigt.

Beachten Sie, dass bei exakten Berechnungen keine Fehler auftreten können, wie aus den Berechnungsblättern des OP ersichtlich.

Es wäre möglich, einen Periodendetektor hinzuzufügen, aber der Speicher aller vorherigen Dezimalteile muss erhalten bleiben (wird zum Problem, wenn Sie beispielsweise eine Periode mit einer Länge von etwa 1000000 haben). Normalerweise beginnt die Periode unmittelbar nach dem Dezimalzeichen und wir können erkennen, wenn sie später beginnt. Trotzdem ist es wahr, dass die Periode enorm groß sein kann:

Betrachten Sie das 0.521728515624Basisbeispiel 16. 1000000000000=10^12ist 16^3mal 5^12. Wir haben also einen Zeitraum, der (außer durch einen wundersamen numerischen Zufall) 3 Ziffern nach dem Dezimalzeichen beginnt. Die Länge des Zeitraums (der Zähler ist hier eine Primzahl bis 5) ist die Reihenfolge von 16in der multiplikativen Gruppe von Z/5^12 Z.

phi(5^12) = 5^12 - 5^11 = 4 * 5^11 = 195312500

Dann

>>> for i in [2, 4, 5]:
...     pow(16, 195312500//i, 244140625)
... 
1
1
97656251

beweist, dass in dieser multiplikativen Gruppe 16genau die gleiche Ordnung vorliegt 5^11 = 48828125. Daher ist dies die Länge der Periode der Basis-16-Erweiterung von 0.521728515624: Das periodische Muster hat 48828125Ziffern!

Im Allgemeinen sehen wir, dass die a priori Ermittlung der Periodenlänge sehr stark mit der Faktorisierung von Zahlen zusammenhängt. Alle obigen Berechnungen hätten mit einem geeigneten xintexpr-Programm ziemlich schnell durchgeführt werden können, da die Primfaktoren (sehr) klein sind. Wenn wir Primfaktoren mit mehr als 8 Ziffern haben, ist dies eine große Herausforderung für Berechnungen, die nur die TeX-Makroerweiterung verwenden!

Ich habe keine tabellarische Darstellung verwendet, um Seitenumbrüche zu ermöglichen. Am besten wäre es, TeX zu verwenden. \halignSie können vielleicht auch die Tabulatorumgebung von LaTeX verwenden (nie getestet). Oder einfach Boxen mit fester Breite.

\documentclass[french]{article}
\usepackage{xintfrac, xinttools}
\usepackage{polexpr}[2018/02/16]% Pour \PolDecToString
\usepackage{babel}
\usepackage[autolanguage,np]{numprint}
\usepackage{amsmath}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\newcommand\ConvertitEnHexa[2][25]{% #1 MUST BE OF THE 0.<decimal digits> type
  % (we can not use 1/5 because numprint's \np macro does not like the /)
  % the dot will be converted into a comma by \np macro
  % computes 25 digits by default. Abort earlier if all become zeros.
  \noindent Nombre à convertir en base 16: \np{#2}.\par
  \edef\ConvertitNombre{\xintRaw{#2}}%
  \xintiloop[1+1]
  \edef\ConvertitSeizeFoisNombre{\xintMul{16}{\ConvertitNombre}}%
  \edef\ConvertitSeizeFoisNombrePartieInt
      {\xintTTrunc{\ConvertitSeizeFoisNombre}}%
  \edef\ConvertitSeizeFoisNombrePartieFrac
      {\xintTFrac{\ConvertitSeizeFoisNombre}}%
  $16\times\np{\PolDecToString{\ConvertitNombre}}
             = \boxed{\ConvertitSeizeFoisNombrePartieInt} +
               \np{\PolDecToString{\ConvertitSeizeFoisNombrePartieFrac}}$\par
  \let\ConvertitNombre\ConvertitSeizeFoisNombrePartieFrac
  \xintifZero{\ConvertitNombre}{\xintbreakiloop}{}%
  \ifnum#1>\xintiloopindex\space
  \repeat
}
\newcommand\ConvertitFracEnHexa[2][25]{%
  % #1 MUST BE OR EXPAND TO A/B WITH 0 < A < B
  % computes 25 digits by default. Abort earlier if all become zeros.
  \edef\ConvertitNombre{\xintIrr{#2}}%
  \noindent Nombre à convertir en base 16: \ConvertitNombre.\par
  \xintiloop[1+1]
  \edef\ConvertitSeizeFoisNombre{\xintMul{16}{\ConvertitNombre}}%
  \edef\ConvertitSeizeFoisNombrePartieInt
      {\xintTTrunc{\ConvertitSeizeFoisNombre}}%
  \edef\ConvertitSeizeFoisNombrePartieFrac
      {\xintTFrac{\ConvertitSeizeFoisNombre}}%
  $16\times\xintFrac{\xintRawWithZeros\ConvertitNombre}
             = \boxed{\ConvertitSeizeFoisNombrePartieInt} +
               \xintFrac{\xintRawWithZeros\ConvertitSeizeFoisNombrePartieFrac}$\par
  \let\ConvertitNombre\ConvertitSeizeFoisNombrePartieFrac
  \xintifZero{\ConvertitNombre}{\xintbreakiloop}{}%
  \ifnum#1>\xintiloopindex\space
  \repeat
}

\begin{document}
\ConvertitEnHexa{0.99609375}

\bigskip

\ConvertitEnHexa{0.521728515625}
\bigskip

\ConvertitEnHexa{0.521728515624}
et ça peut continuer longtemps avant que l'on voie la période\dots\bigskip

\clearpage
\ConvertitEnHexa[12]{0.4075}
etc\dots

\bigskip

\ConvertitFracEnHexa[12]{4095/4096}

\bigskip

\ConvertitFracEnHexa[7]{1/5}
etc\dots

\bigskip

\ConvertitFracEnHexa[7]{3/7}
etc\dots

\bigskip

\clearpage

\ConvertitFracEnHexa[7]{9/11}
etc\dots

\end{document}

Letzte Aktualisierung. Bilder wurden entsprechend aktualisiert.

\documentclass[french]{article}
\usepackage{xintfrac, xinttools}
\usepackage{polexpr}[2018/02/16]% Pour \PolDecToString
\usepackage{babel}
\usepackage[autolanguage,np]{numprint}
\usepackage{amsmath}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\newcommand\MiniConvert[1]{\ifcase #1
  0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or 9\or A\or B\or C\or D\or E\or
  F\or G\or H\or I\or J\or K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or
  U\or V\or W\or X\or Y\or Z\else\ERROR\fi}%
\newcommand\ConvertitEnBaseB[3][25]{% #1 MUST BE OF THE 0.<decimal digits> type
  % (we can not use 1/5 because numprint's \np macro does not like the /)
  % the dot will be converted into a comma by \np macro
  % computes 25 digits by default. Abort earlier if all become zeros.
  % #3 = base < 36
     \def\ConvertiDots{\dots}%
  \noindent Nombre à convertir en base #3: \np{#2}.\par
  \def\Converti{0,}%<<<< LOCALIZE TO YOUR LANGUAGE
  \edef\ConvertitNombre{\xintRaw{#2}}%
  \xintiloop[1+1]
  \edef\ConvertitBFoisNombre{\xintMul{#3}{\ConvertitNombre}}%
  \edef\ConvertitBFoisNombrePartieInt
      {\xintTTrunc{\ConvertitBFoisNombre}}%
  \edef\ConvertitBFoisNombrePartieFrac
      {\xintTFrac{\ConvertitBFoisNombre}}%
  $#3\times\np{\PolDecToString{\ConvertitNombre}}
             = \boxed{\ConvertitBFoisNombrePartieInt} +
               \np{\PolDecToString{\ConvertitBFoisNombrePartieFrac}}$
  \hfill
  \llap{${}\longrightarrow{}$\MiniConvert\ConvertitBFoisNombrePartieInt}\par
  \edef\Converti{\Converti\MiniConvert{\ConvertitBFoisNombrePartieInt}}%
  \let\ConvertitNombre\ConvertitBFoisNombrePartieFrac
  \xintifZero{\ConvertitNombre}
    {\xintbreakiloopanddo\let\ConvertiDots\empty.}%
    {}%
  \ifnum#1>\xintiloopindex\space
  \repeat
  \noindent\mbox{}\hfill$\np{#2}=[$\Converti\ConvertiDots$]_{#3}$\par
}
\newcommand\ConvertitFracEnBaseB[3][25]{%
  % #1 MUST BE OR EXPAND TO A/B WITH 0 < A < B
  % computes 25 digits by default. Abort earlier if all become zeros.
     \def\ConvertiDots{\dots}%
  \edef\ConvertitNombre{\xintIrr{#2}}%
  \def\Converti{0,}%<<<< LOCALIZE TO YOUR LANGUAGE
  \noindent Nombre à convertir en base #3: \ConvertitNombre.\par
  \xintiloop[1+1]
  \edef\ConvertitBFoisNombre{\xintMul{#3}{\ConvertitNombre}}%
  \edef\ConvertitBFoisNombrePartieInt
      {\xintTTrunc{\ConvertitBFoisNombre}}%
  \edef\ConvertitBFoisNombrePartieFrac
      {\xintTFrac{\ConvertitBFoisNombre}}% does \xintREZ, not good for us
  $#3\times\xintFrac{\xintRawWithZeros\ConvertitNombre}
             = \boxed{\ConvertitBFoisNombrePartieInt} +
               \xintFrac{\xintRawWithZeros\ConvertitBFoisNombrePartieFrac}$\par
  \hfill
  \llap{${}\longrightarrow{}$\MiniConvert\ConvertitBFoisNombrePartieInt}\par
  \edef\Converti{\Converti\MiniConvert{\ConvertitBFoisNombrePartieInt}}%
  \let\ConvertitNombre\ConvertitBFoisNombrePartieFrac
  \xintifZero{\ConvertitNombre}
    {\xintbreakiloopanddo\let\ConvertiDots\empty.}%
    {}%
  \ifnum#1>\xintiloopindex\space
  \repeat
  \noindent\mbox{}\hfill$\xintFrac{#2}=[$\Converti\ConvertiDots$]_{#3}$\par}%


\begin{document}
\ConvertitEnBaseB{0.99609375}{16}

\bigskip

\ConvertitEnBaseB{0.521728515625}{16}
\bigskip

\ConvertitEnBaseB{0.521728515624}{16}
et ça peut continuer longtemps avant que l'on voie la période\dots\bigskip

\ConvertitEnBaseB[12]{0.4075}{16}
etc\dots

\bigskip

\ConvertitFracEnBaseB[12]{4095/4096}{16}

\bigskip

\ConvertitFracEnBaseB[7]{1/5}{16}
etc\dots

\bigskip

\ConvertitFracEnBaseB[7]{3/7}{16}
etc\dots

\bigskip

\ConvertitFracEnBaseB[10]{9/11}{16}
etc\dots

\bigskip

\ConvertitFracEnBaseB[10]{9/11}{15}
etc\dots

\bigskip

\ConvertitFracEnBaseB[10]{9/11}{14}
etc\dots

\bigskip

\ConvertitFracEnBaseB[15]{9/11}{13}
etc\dots

\bigskip

\ConvertitFracEnBaseB[10]{9/11}{36}
etc\dots

\bigskip

\ConvertitFracEnBaseB[15]{9/11}{2}
etc\dots
\end{document}

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

verwandte Informationen