LaTeX3:\fp_pow:Nn 给出错误结果

LaTeX3:\fp_pow:Nn 给出错误结果

我想用该包从有理数中得出平方根l3fp。由于该包不提供 sqrt 函数,我尝试了\fp_pow:Nn。不幸的是,我只能得到 $\sqrt{4}$ 的正确结果:

\documentclass{article}
\usepackage{expl3}

\begin{document}

\ExplSyntaxOn

\fp_set:Nn\a_fp{0.04}
\fp_pow:Nn\a_fp{0.5}
\fp_use:N\a_fp\par    %wrong

\fp_set:Nn\a_fp{4.0}
\fp_pow:Nn\a_fp{0.5}
\fp_use:N\a_fp\par    %ok

\fp_set:Nn\a_fp{9.0}
\fp_pow:Nn\a_fp{0.5}
\fp_use:N\a_fp\par    %wrong

\fp_set:Nn\a_fp{16.0}
\fp_pow:Nn\a_fp{0.5}
\fp_use:N\a_fp\par    %wrong

\ExplSyntaxOff

\end{document}

答案1

正如 Joseph 所说,代码非常复杂。该错误应该在 SVN 中得到修复(可能在下周左右的 CTAN 上随着 expl3 的下一次更新)。

如果你等不及,你也可以重新定义有问题的函数\fp_pow_aux_iv:。只有结尾改变了,但函数却很庞大。

\cs_set_protected_nopar:Npn \fp_pow_aux_iv:
  {
    \group_begin:
      \l_fp_input_a_integer_int  \l_fp_input_b_integer_int
      \l_fp_input_a_decimal_int  \l_fp_input_b_decimal_int
      \l_fp_input_a_exponent_int \l_fp_input_b_exponent_int
      \fp_ln_internal:
      \cs_set_protected_nopar:Npx \fp_tmp:w
        {
          \group_end:
          \exp_not:N \l_fp_input_b_sign_int
            \int_use:N \l_fp_output_sign_int \scan_stop:
          \exp_not:N \l_fp_input_b_integer_int
            \int_use:N \l_fp_output_integer_int \scan_stop:
          \exp_not:N \l_fp_input_b_decimal_int
            \int_use:N \l_fp_output_decimal_int \scan_stop:
          \exp_not:N \l_fp_input_b_extended_int
            \int_use:N \l_fp_output_extended_int \scan_stop:
          \exp_not:N \l_fp_input_b_exponent_int
            \int_use:N \l_fp_output_exponent_int \scan_stop:
        }
    \fp_tmp:w
    \l_fp_input_a_extended_int  \c_zero
    \fp_mul:NNNNNNNNN
      \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
        \l_fp_input_a_extended_int
      \l_fp_input_b_integer_int \l_fp_input_b_decimal_int
        \l_fp_input_b_extended_int
      \l_fp_output_integer_int \l_fp_output_decimal_int
        \l_fp_output_extended_int
    \l_fp_output_exponent_int
      \int_eval:w
        \l_fp_input_a_exponent_int + \l_fp_input_b_exponent_int
      \scan_stop:
    \fp_extended_normalise_output:
    \tex_multiply:D \l_fp_input_a_sign_int \l_fp_input_b_sign_int
    \l_fp_input_a_integer_int  \l_fp_output_integer_int
    \l_fp_input_a_decimal_int  \l_fp_output_decimal_int
    \l_fp_input_a_extended_int \l_fp_output_extended_int
    \l_fp_input_a_exponent_int \l_fp_output_exponent_int
    \l_fp_output_integer_int  \c_zero
    \l_fp_output_decimal_int  \c_zero
    \l_fp_output_extended_int \c_zero
    \l_fp_output_exponent_int \c_zero
    \cs_set_eq:NN \fp_exp_const:Nx \use_none:nn
    \fp_exp_internal:
  }

答案2

有趣的是

\fp_set:Nn\a_fp{0.04}
\fp_ln:Nn\a_fp{\a_fp}
\fp_div:Nn\a_fp{2}
\fp_exp:Nn\a_fp{\a_fp}
\fp_use:N\a_fp\par

打印 0.2000000010,但使用4作为参数打印 1.999999999。

\fp_set:Nn\a_fp{0.04}和之后\fp_pow:Nn\a_fp{0.5}\fp_show:N\a_fp显示+2.624477407e0。与 4 一起使用时显示+2.000000000e0。与 一起使用时400显示“数字太大”!

注意:我的 l3fp.sty 版本是l3fp.dtx 2201 2011-03-19 17:16:13Z

相关内容