是否有一种聪明的方法可以使用 fp 包获得一致的准确度?

是否有一种聪明的方法可以使用 fp 包获得一致的准确度?

有没有一种聪明的方法可以让包获得一致的准确性 ?我肯定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}

相关内容