我想用该包从有理数中得出平方根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