Ich wollte eine Tabelle mit trigonometrischen Werten erstellen pgfmath
. Allerdings ist die Genauigkeit etwas daneben. Gibt es eine Möglichkeit, dies innerhalb zu verbessern TikZ
?
Dies hängt mit einer ähnlichen Frage zusammen, die ich gerade gepostet habe:Gibt es eine Möglichkeit, mit Expl3 das Ende einer gerundeten Zahl mit Nullen aufzufüllen?
Hier ist mein aktuelles Arbeitsbeispiel:
\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}
Antwort1
Ich weiß nicht mit pgfmath
; mit expl3
können Sie Ihre Tabelle folgendermaßen zusammenstellen:
\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}
Hier ist der Anfang:
Und hier ist das Ende, nur um zu zeigen, was bei 89 Grad passiert:
Ich habe fünf Ziffern zum Vergleich mit dem Wert verwendet, der bc
für den Tangens von 89 Grad zurückgegeben wird:
57.28996163075942465214
Antwort2
Erweitern Sie Ihre Möglichkeiten mit 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}
Antwort3
Bei der Standard-TeX-Arithmetik ist die Genauigkeit sehr begrenzt. Wenn Sie genauere Ergebnisse benötigen, müssen Sie möglicherweise ein externes Programm oder eine Erweiterung von TeX wie z. B. luatex verwenden.
Mein Paket verwendenTaschenrechnerIch erhalte ähnliche Ergebnisse wie Sie mit 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}