如何使用 xfp 包计算阶乘

如何使用 xfp 包计算阶乘

我正在尝试使用该包计算阶乘xfp。在文档中(http://ctan.cs.uu.nl/macros/latex/contrib/l3packages/xfp.pdf),我发现函数名称是fact。我的代码如下:

\documentclass{article}
\usepackage{xfp}
\begin{document}
\fpeval{fact(4)}
\end{document}

但是,我收到以下错误:

! Undefined control sequence.
<argument> \LaTeX3 error: 
                           Unknown fp word fact.
l.4 \fpeval{fact(4)}

虽然其他功能确实有效(例如\fpeval{16*4^3}或 没有错误\fpeval{cosd(60)*45}

我做错了什么?我正在使用 TeXstudio。

更新

在序言中,我将 \usepackage{xfp}[2019/08/25] 在文档中找到的日期设置在方括号之间。

我收到与之前相同的错误并出现以下警告:

You have requested, on input line 3, version `2019/08/25' of package xfp, 
but only version `2018-09-24 L3 Floating point unit' is available.

当我设置时 \usepackage{xfp}[2018/09/24],我收到相同的错误(并且没有警告)。

在任何情况下(带或不带方括号中的日期),我都会在日志文件中看到以下几行:

Package: expl3 2018-09-24 L3 programming layer (code)
Package: xparse 2018-09-24 L3 Experimental document command parser
Package: xfp 2018-09-24 L3 Floating point unit

我通过公司服务器远程使用 Texworks,因此无法访问包管理器或其他任何东西。也不能使用 texdoc。有没有办法从 Texworks 内部强制更新包?(可能不行……)

答案1

您确实应该更新您的 L3 软件包。但是,如果出于某种原因您不希望这样做,那么您可以从文档中复制更新的软件包中的相关代码,以便使用新代码。

梅威瑟:

\documentclass{article}
\usepackage{xfp}
\makeatletter
\ExplSyntaxOn
\long \def \__kernel_primitive:NN #1#2
    {
      \tex_global:D \tex_let:D #2 #1
    }
\__kernel_primitive:NN \numexpr               \tex_numexpr:D
\cs_new_eq:NN \int_value:w      \tex_number:D
\cs_new_eq:NN \__fp_int_eval:w \tex_numexpr:D
\cs_new:Npn \__fp_parse_word_fact:N
  { \__fp_parse_unary_function:NNN \__fp_fact_o:w ? }
\int_const:Nn \c__fp_fact_max_arg_int { 3248 }
\cs_new:Npn \__fp_fact_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
  {
    \if_case:w #2 \exp_stop_f:
      \__fp_case_return_o:Nw \c_one_fp
    \or:
    \or:
      \if_meaning:w 0 #3
        \exp_after:wN \__fp_case_return_same_o:w
      \fi:
    \or:
      \__fp_case_return_same_o:w
    \fi:
    \if_meaning:w 2 #3
      \__fp_case_use:nw { \__fp_invalid_operation_o:fw { fact } }
    \fi:
    \__fp_fact_pos_o:w
    \s__fp \__fp_chk:w #2 #3 #4 ;
  }
\cs_new:Npn \__fp_fact_pos_o:w #1;
  {
    \__fp_small_int:wTF #1;
      { \__fp_fact_int_o:n }
      { \__fp_invalid_operation_o:fw { fact } #1; }
  }
\cs_new:Npn \__fp_fact_int_o:n #1
  {
    \if_int_compare:w #1 > \c__fp_fact_max_arg_int
      \__fp_case_return:nw
        {
          \exp_after:wN \exp_after:wN \exp_after:wN \__fp_overflow:w
          \exp_after:wN \c_inf_fp
        }
    \fi:
    \exp_after:wN \__fp_sanitize:Nw
    \exp_after:wN 0
    \int_value:w \tex_numexpr:D
    \__fp_fact_loop_o:w #1 . 4 , { 1 } { } { } { } { } { } ;
  }
\cs_new:Npn \__fp_fact_loop_o:w #1 . #2 ;
  {
    \if_int_compare:w #1 < 12 \exp_stop_f:
      \__fp_fact_small_o:w #1
    \fi:
    \exp_after:wN \__fp_ep_mul:wwwwn
    \exp_after:wN 4 \exp_after:wN ,
    \exp_after:wN { \int_value:w \__fp_int_eval:w #1 * (#1 - 1) }
    { } { } { } { } { } ;
    #2 ;
    {
      \exp_after:wN \__fp_fact_loop_o:w
      \int_value:w \__fp_int_eval:w #1 - 2 .
    }
  }
\cs_new:Npn \__fp_fact_small_o:w #1 \fi: #2 ; #3 ; #4
  {
    \fi:
    \exp_after:wN \__fp_ep_mul:wwwwn
    \exp_after:wN 4 \exp_after:wN ,
    \exp_after:wN
      {
        \int_value:w
        \if_case:w #1 \exp_stop_f:
        1 \or: 1 \or: 2 \or: 6 \or: 24 \or: 120 \or: 720 \or: 5040
        \or: 40320 \or: 362880 \or: 3628800 \or: 39916800
        \fi:
      } { } { } { } { } { } ;
    #3 ;
    \__fp_ep_to_float_o:wwN 0
  }
\ExplSyntaxOff
\makeatother
\begin{document}
\fpeval{fact(4)}
\end{document}

请注意,这可能会在某个时候中断,我测试了几种情况,但可能存在我没有复制的代码,这些代码被调用用于我未测试的其他情况。因此,如果可以,请更新。

相关内容