错误:算术溢出

错误:算术溢出

动机

我正在尝试“自动”计算不同的概率,仅给出一些变量,例如样本中的卡片数量和抽出的卡片数量。

代码

以下代码由以下代码组合而成:使用 LaTeX3 自动简化分数“ 和 ”整数乘法命令“。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\cs_new:Nn \svend_gcd:nn
  {
    \int_compare:nNnTF {#2} = { 0 } {#1}
      { \svend_gcd:ff {#2} { \int_mod:nn {#1} {#2} } }
  }
\cs_generate_variant:Nn \svend_gcd:nn { ff }

\int_new:N \l__svend_tmp_int
\cs_new:Nn \svend_reduced:nn
  {
    \int_set:Nn \l__svend_tmp_int { \svend_gcd:nn {#1} {#2} }
    \frac { \svend_reduced_wrap:n { \int_eval:n { #1 / \l__svend_tmp_int } } }
          { \svend_reduced_wrap:n { \int_eval:n { #2 / \l__svend_tmp_int } } }
  }
\cs_new:Nn \svend_reduced_use_wrapper:N
  { \cs_set_eq:NN \svend_reduced_wrap:n #1 }
\svend_reduced_use_wrapper:N \use:n

\msg_new:nnn { svend } { malformed-fraction }
  {
    The~input~you~have~provided~is~malformed.~
    Please~provide~input~in~the~form~of~`p/q'.
  }

\NewDocumentCommand \ReducedFractionWrapper { m }
  { \svend_reduced_use_wrapper:N #1 }

\NewDocumentCommand \ReducedFraction { o > { \SplitList { / } } m }
  {
    \group_begin:
    \IfValueT{#1}{\ReducedFractionWrapper{#1}}
    \int_compare:nTF { \tl_count:n {#2} = 2 }
      { \svend_reduced:nn #2 }
      { \msg_error:nn { svend } { malformed-fraction } }
    \group_end:
  }

\NewExpandableDocumentCommand \produkt { m m }
  { \svend_multiply:nn {#1} {#2} }
\cs_new:Npn \svend_multiply:nn #1#2
  {
    \int_eval:n
      { 1 \int_step_function:nnN {#1} {#2} \__svend_multiply:n }
  }
\cs_new:Npn \__svend_multiply:n #1 { * #1 }
\ExplSyntaxOff


\usepackage{siunitx}

\begin{document}

\def\roed{5}
\def\sort{9}
\newcommand*\kortTotal{\fpeval{\roed+\sort}}
\def\udtraek{10}

\begin{equation}
  \ReducedFraction[\num]
    {(\produkt{\kortTotal-\udtraek+1}{\kortTotal}-\produkt{1}{\udtraek})
     /\produkt{\kortTotal-\udtraek+1}{\kortTotal}}
\end{equation}

\end{document}

错误

我得到了错误

! Arithmetic overflow.
<recently read> \__int_eval_end: 
                 
l.66 ...\produkt{\kortTotal-\udtraek+1}{\kortTotal}}

当我将其改为 时\def\udtraek{10}\def\udtraek{9}编译就好了。数字显然太大了( 也表明了这一点Arithmetic overflow),但我不知道如何调整代码以便使用更大的数字。

问题

我如何更改代码以便可以使用更大的输入整数?

答案1

目前,你最好的选择可能是xint's \xintiieval,可以处理大整数解析表达式。(有一些未发布的expl3该区域的代码,但需要一些整理;bigintcalc不做表情。)

采用这种方式并简化以突出关键点:

\documentclass{article}
\usepackage{xintexpr}
\makeatletter
\newcommand\svend@saved@gcd{}
\NewDocumentCommand\ReducedFraction{O{\@firstofone}mm}
  {%
    \edef\svend@saved@gcd{gcd(#2,#3)}%
    \expanded{%
      \noexpand\frac
        {%
          \noexpand#1%
            {\xintiieval{#2/\svend@saved@gcd}}%
        }%
        {%
          \noexpand#1%
            {\xintiieval{#3/\svend@saved@gcd}}%
        }%
     }% 
  }
\makeatother
\NewExpandableDocumentCommand\produkt{mm}
  {\xintiieval{pfactorial(#1,#2)}}

\usepackage{siunitx}

\begin{document}

\def\roed{5}
\def\sort{9}
\newcommand*\kortTotal{}
\edef\kortTotal{\xintiieval{\roed+\sort}}
\def\udtraek{9}

\begin{equation}
  \ReducedFraction[\num]
    {(\produkt{\kortTotal-\udtraek+1}{\kortTotal}-\produkt{1}{\udtraek})}
    {\produkt{\kortTotal-\udtraek+1}{\kortTotal}}
\end{equation}

\end{document}

相关内容