소수점을 이진수로 변환하는 방법을 설명하는 방법

소수점을 이진수로 변환하는 방법을 설명하는 방법

\baseexpansion질문에 대한 jfbu의 답변에 있는 명령에 따라 소수점을 이진수로 변환하고 싶습니다 .

10진수를 2진수로 변환하는 방법을 어떻게 설명할 수 있나요?

b예를 들어, base 의 0.4075 또는 base 의 0.A46C 와 같은 숫자를 변환하고 싶습니다 10. 불행히도 LaTeX에서 프로그래밍하는 방법을 모르겠습니다.

만든 사람이 있나요? 자비에르.

더 정확하게 말하자면: 정신적 계획을 원합니다.이미지 테이블러

필요한 경우 반복 후에 중지하고 싶습니다. 여기에 이미지 설명을 입력하세요

LaTeX에 표시할 더 나은 알고리즘이 있으면 매우 기쁠 것입니다.

감사해요! 훌륭한 작품을 만드셨어요!

마지막으로 2부터 36까지의 어떤 진수에도 동일한 결과를 얻을 수 있습니까? 결과는 아래 그림과 같이 문자로 작성됩니다. 종악장

답변1

1/5에는 무한히 많은 계수가 필요하기 때문에 십진수에서 이진수로 정확하게 변환할 수 없습니다. (그러나 주기적 확장을 얻기 위한 코드를 작성할 수는 있습니다)

16진수에서 10진수로 이동하는 경우 xintexpr.

그러나 결과는 xintfrac내부 표기법을 \PolDecToString사용 하므로 polexpr 0.4. (아주 최근에는 TeX 설치를 업데이트해야 할 수도 있습니다).

\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}

여기에 이미지 설명을 입력하세요


이진수를 십진수로 변환하는 방법은 다음과 같습니다.

\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}

여기에 이미지 설명을 입력하세요


OP에 계산서를 추가한 후 디자인을 찾았습니다.

모든 계산은 정확하므로 OP의 계산서에 명백한 오류가 있을 수 없습니다.

기간 감지기를 추가하는 것이 가능할 수 있지만 이전의 모든 분수 부분에 대한 메모리는 유지되어야 합니다(예를 들어 기간 길이가 1000000인 경우 문제가 됩니다). 일반적으로 기간은 소수점 바로 뒤에 시작되며 나중에 시작되는 시기를 감지할 수 있습니다. 그럼에도 불구하고 그 기간이 엄청나게 클 수 있다는 것은 사실입니다.

0.521728515624기본 예제 를 고려하십시오 16. 시간 1000000000000=10^12입니다 . 따라서 우리는 (기적적인 수치적 일치를 제외하고) 소수점 이하 3자리에서 시작하는 마침표를 갖게 됩니다. 기간의 길이(여기서 분자는 5의 소수임)는 의 곱셈 그룹에서 의 순서가 됩니다 .16^35^1216Z/5^12 Z

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

그 다음에

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

이 곱셈 그룹에서 이것이 16정확히 순서임을 증명합니다 . 5^11 = 48828125따라서 이것은 16진수 확장 기간의 길이입니다 0.521728515624. 주기 패턴에는 48828125숫자가 있습니다!

일반적으로 기간 길이를 선험적으로 찾는 것은 숫자를 인수분해하는 것과 매우 관련이 있음을 알 수 있습니다. 위의 모든 계산은 소인수가 (매우) 작기 때문에 적절한 xintexpr 프로그램을 사용하면 상당히 빠르게 수행될 수 있습니다. 8자리 이상의 소인수를 갖기 시작하면 TeX 매크로 확장만 사용하는 계산에서는 어려운 과제입니다!

\halign나는 페이지 나누기를 허용하기 위해 테이블 ​​형식을 사용하지 않았습니다. LaTeX의 탭 환경(테스트되지 않음)을 사용할 수도 있는 TeX를 사용하는 것이 가장 좋습니다 . 아니면 단순히 고정된 너비의 상자일 수도 있습니다.

\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}

마지막 업데이트. 이에 대응하여 이미지가 업데이트되었습니다.

\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}

여기에 이미지 설명을 입력하세요

여기에 이미지 설명을 입력하세요

여기에 이미지 설명을 입력하세요

여기에 이미지 설명을 입력하세요

여기에 이미지 설명을 입력하세요

여기에 이미지 설명을 입력하세요

관련 정보