有没有一种聪明的方法可以让包获得一致的准确性 ?我肯定fp
不想用!round
\documentclass[preview,border=12pt]{standalone}
\usepackage[nomessages]{fp}
\FPeval\Sixty{trunc(cos(pi/3):12)}
\FPeval\ThreeHundred{trunc(cos(5*pi/3):12)}
\usepackage{amsmath}
\begin{document}
$\!
\begin{aligned}
\cos 60^\circ &= \Sixty\\
\cos 300^\circ &= \ThreeHundred
\end{aligned}
$
\end{document}
答案1
在您的情况下,的计算cos(5*pi/3)
精度更高,但的选择trunc
比更差round
:
\documentclass[preview,border=12pt]{standalone}
\usepackage[nomessages]{fp}
\FPeval\Sixty{trunc(cos(pi/3):12)}
\FPeval\ThreeHundredTrunc{trunc(cos(5*pi/3):12)}
\FPeval\ThreeHundredRound{round(cos(5*pi/3):12)}
\FPeval\Tmp{cos(5*pi/3)}
\FPeval\TruncDelta{\Tmp-\ThreeHundredTrunc}
\FPeval\RoundDelta{\Tmp-\ThreeHundredRound}
\usepackage{amsmath}
\begin{document}
$\!
\begin{aligned}
\cos 60^\circ &= \Sixty\\
\cos 300^\circ &= \ThreeHundredTrunc~\text{(trunc)}
& \Delta &= +\TruncDelta\\
\cos 300^\circ &= \ThreeHundredRound~\text{(round)}
& \Delta &= \RoundDelta
\end{aligned}
$
\end{document}
在这种情况下,使用 计算的最终误差trunc
比使用 的变量大 999999 倍round
。
十进制(或二进制)数字的浮点运算有其局限性,因为有理数在十进制(或二进制)系统中无法用有限的位数来表示。典型的解决方法是在内部表示中使用更高的精度并对结果进行舍入。使用截断会使情况变得更糟。
答案2
也许 LaTeX3 是一个选项。相关文档l3fp
:
\documentclass[11pt]{article}
\usepackage{expl3,l3fp}
\usepackage{xparse, siunitx}
\ExplSyntaxOn
\NewDocumentCommand { \calcnum } { m }
{ \num [ round-mode=places , round-precision=2 ] { \fp_to_decimal:n {#1} } }
\ExplSyntaxOff
\begin{document}
\[\cos(60)=\calcnum { cos( pi/3 ) }\]
\[\cos(300)=\calcnum { cos( 5*pi/3 ) }\]
\end{document}