Existe uma maneira simples de melhorar a precisão do pgfmath para funções trigonométricas?

Existe uma maneira simples de melhorar a precisão do pgfmath para funções trigonométricas?

Eu queria construir uma tabela de valores trigonométricos usando pgfmath. No entanto, a precisão está um pouco errada. Existe uma maneira de melhorar isso dentro TikZ?

Isso está relacionado a uma pergunta semelhante que acabei de postar:Existe uma maneira de preencher zeros no final de um número arredondado com Expl3?

Aqui está meu exemplo de trabalho atual:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc,fixedpointarithmetic}

\def\mynum{0}
\def\myvoffset{0pt}

\usepackage[margin=0.5in]{geometry}

\begin{document}

Using \texttt{TikZ}

\begin{tikzpicture}[/pgf/number format/.cd,fixed,precision=4,verbatim]

  \coordinate(UL) at (0,0);

  \node at (UL) {Degrees};
  \node[anchor=west] at ($(UL.west)+(1cm,0)$) {$\sin$};
  \node[anchor=west] at ($(UL.west)+(2.75cm,0)$) {$\cos$};
  \node[anchor=west] at ($(UL.west)+(4.50cm,0)$) {$\tan$};

  \foreach \myn in {1,2,3,...,45}
  {
    \pgfmathparse{int(mod(\myn-1,5))}
    \ifnum\pgfmathresult=0\relax
      \xdef\myvoffset{\dimexpr\myvoffset+1.350\baselineskip}%%
    \else
      \xdef\myvoffset{\dimexpr\myvoffset+1.00\baselineskip}%%
    \fi

    \coordinate (DEG/\myn)   at ($(UL.west)-(0,\myvoffset)$);
    \coordinate (DEG/S/\myn) at ($(DEG/\myn)+(1cm,0)$);
    \coordinate (DEG/C/\myn) at ($(DEG/S/\myn)+(1.75cm,0)$);
    \coordinate (DEG/T/\myn) at ($(DEG/C/\myn)+(1.75cm,0)$);

    \node[anchor=east] at (DEG/\myn) {$\myn^\circ$};
    \pgfmathparse{sin(\myn)} \node[anchor=west] at (DEG/S/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
    \pgfmathparse{cos(\myn)} \node[anchor=west] at (DEG/C/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
    \pgfmathparse{tan(\myn)} \node[anchor=west] at (DEG/T/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};

  }

\end{tikzpicture}

\end{document}

insira a descrição da imagem aqui

Responder1

Eu não sei com pgfmath; com expl3você pode compilar sua tabela assim:

\documentclass{article}
\usepackage[margin=1cm]{geometry}

\usepackage{array,siunitx}

\sisetup{
  add-decimal-zero,
  round-precision=5,
  round-mode=places,
  round-integer-to-decimal,
  group-digits=false,
  detect-all,
}

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\trigtable}{ }
 {
  \__aellett_do_trig:
  \begin{tabular}{r *{3}{ >{\ttfamily}r }}
  & \multicolumn{1}{c}{$\sin$}
  & \multicolumn{1}{c}{$\cos$}
  & \multicolumn{1}{c}{$\tan$}
  \\
  \tl_use:N \l__aellett_body_tl
  \end{tabular}
 }

\tl_new:N \l__aellett_body_tl

\cs_new:Npn \aellett_compute:nn #1 #2
 {
  \num { \fp_to_decimal:n { \fp_eval:n { round ( #1(#2) , 5 ) } } }
 }

\cs_new_protected:Npn \__aellett_do_trig:
 {
  \tl_clear:N \l__aellett_body_tl
  \int_step_inline:nnnn { 1 } { 1 } { 89 }
   {
    \tl_put_right:Nn \l__aellett_body_tl { $##1^\circ$ & }
    \tl_put_right:Nx \l__aellett_body_tl
     { 
      \aellett_compute:nn { sind } { ##1 } &
      \aellett_compute:nn { cosd } { ##1 } &
      \aellett_compute:nn { tand } { ##1 } 
     }
    \int_compare:nTF { \int_mod:nn { ##1 } { 5 } == 0 }
     {
      \tl_put_right:Nn \l__aellett_body_tl { \\[1ex] }
     }
     {
      \tl_put_right:Nn \l__aellett_body_tl { \\ }
     }
   }
  % 90 degrees
  \tl_put_right:Nx \l__aellett_body_tl
   {
    $90^\circ$ &
    \aellett_compute:nn { sind } { 90 } &
    \aellett_compute:nn { cosd } { 90 } &
    --- 
   }

 }

\ExplSyntaxOff

\begin{document}
\tiny
\trigtable

\end{document}

Aqui está o começo:

começar

E aqui está o final, só para mostrar o que acontece a 89 graus:

fim

Usei cinco dígitos para comparação com o valor bcretornado para a tangente de 89 graus:

57.28996163075942465214

Responder2

Amplie suas opções com fixed zerofill.

\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{calc,fixedpointarithmetic}
\def\mynum{0}
\def\myvoffset{0pt}
\usepackage[margin=0.5in]{geometry}

\begin{document}
%Using \texttt{TikZ}
\begin{tikzpicture}[/pgf/number format/.cd,fixed,precision=4,verbatim, fixed zerofill]
  \coordinate(UL) at (0,0);
  \node at (UL) {Degrees};
  \node[anchor=west] at ($(UL.west)+(1cm,0)$) {$\sin$};
  \node[anchor=west] at ($(UL.west)+(2.75cm,0)$) {$\cos$};
  \node[anchor=west] at ($(UL.west)+(4.50cm,0)$) {$\tan$};
  \foreach \myn in {1,2,3,...,45}
  {
    \pgfmathparse{int(mod(\myn-1,5))}
    \ifnum\pgfmathresult=0\relax
      \xdef\myvoffset{\dimexpr\myvoffset+1.350\baselineskip}%%
    \else
      \xdef\myvoffset{\dimexpr\myvoffset+1.00\baselineskip}%%
    \fi
    \coordinate (DEG/\myn)   at ($(UL.west)-(0,\myvoffset)$);
    \coordinate (DEG/S/\myn) at ($(DEG/\myn)+(1cm,0)$);
    \coordinate (DEG/C/\myn) at ($(DEG/S/\myn)+(1.75cm,0)$);
    \coordinate (DEG/T/\myn) at ($(DEG/C/\myn)+(1.75cm,0)$);
    \node[anchor=east] at (DEG/\myn) {$\myn^\circ$};
    \pgfmathparse{sin(\myn)} \node[anchor=west] at (DEG/S/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
    \pgfmathparse{cos(\myn)} \node[anchor=west] at (DEG/C/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
    \pgfmathparse{tan(\myn)} \node[anchor=west] at (DEG/T/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
  }
\end{tikzpicture}
\end{document}

eu

Responder3

Com a aritmética padrão do TeX, a precisão é muito limitada. Se você precisar de resultados mais precisos, pode ser necessário usar algum programa externo ou qualquer extensão do TeX, como luatex.

Usando meu pacotecalculadoraObtenho resultados semelhantes aos que você obtém com o Tikz:

\documentclass{article}
\usepackage{calculator}
\usepackage{ifthen}

\begin{document}
\newcounter{angle}
\newcommand{\trigfunctions}[1]{%
    #1^{\mathrm{o}} &
    \DEGREESSIN{#1}{\sine}
    \ROUND[4]{\sine}{\sine}
    \sine & 
    \DEGREESCOS{#1}{\cosine}
    \ROUND[4]{\cosine}{\cosine}
    \cosine  & 
    \DEGREESTAN{#1}{\tangent}
    \ROUND[4]{\tangent}{\tangent}
    \tangent& 
    \DEGREESCOT{#1}{\cotangent}
    \ROUND[4]{\cotangent}{\cotangent}
    \cotangent \\}

\small
\[
\begin{array}{*{5}{r}}
\multicolumn{1}{c}{\alpha} & \multicolumn{1}{c}{\sin\alpha} & 
                             \multicolumn{1}{c}{\cos \alpha} & 
                             \multicolumn{1}{c}{\tan\alpha} & 
                             \multicolumn{1}{c}{\cot\alpha} \\
\whiledo{\value{angle}<45}{\stepcounter{angle}\trigfunctions{\theangle}}
\end{array}
\]
\end{document}

tabela trigonométrica

informação relacionada