diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/expl3/l3fp.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/expl3/l3fp.dtx | 83 |
1 files changed, 64 insertions, 19 deletions
diff --git a/Master/texmf-dist/source/latex/expl3/l3fp.dtx b/Master/texmf-dist/source/latex/expl3/l3fp.dtx index 8eb2530143c..7251d1af935 100644 --- a/Master/texmf-dist/source/latex/expl3/l3fp.dtx +++ b/Master/texmf-dist/source/latex/expl3/l3fp.dtx @@ -35,7 +35,7 @@ \RequirePackage{l3names} %</driver|package> %\fi -\GetIdInfo$Id: l3fp.dtx 2104 2010-12-18 09:29:34Z joseph $ +\GetIdInfo$Id: l3fp.dtx 2128 2011-01-10 22:44:33Z joseph $ {L3 Experimental floating-point operations} %\iffalse %<*driver> @@ -3058,10 +3058,11 @@ % \end{macrocode} %\end{macro} % -%\begin{macro}{\fp_sub:NNNNNNNNNN} +%\begin{macro}{\fp_sub:NNNNNNNNN} % Internal subtraction is needed only when the first number is bigger % than the second, so there is no need to worry about the sign. This is -% a good job as there are no arguments left. +% a good job as there are no arguments left. The flipping flag is +% used in the rare case where a sign change is possible. % \begin{macrocode} \cs_new_protected_nopar:Npn \fp_sub:NNNNNNNNN #1#2#3#4#5#6#7#8#9 { #7 \etex_numexpr:D #1 - #4 \scan_stop: @@ -3368,6 +3369,7 @@ % %\begin{macro}{\fp_trig_normalise:} %\begin{macro}[aux]{\fp_trig_normalise_aux:} +%\begin{macro}[aux]{\fp_trig_sub:NNN} % For normalisation, the code essentially switches to fixed-point % arithmetic. There is a shift of the exponent, then repeated % subtractions. The end result is a number in the range @@ -3393,22 +3395,14 @@ } \cs_new_protected_nopar:Npn \fp_trig_normalise_aux: { \tex_ifnum:D \l_fp_input_a_integer_int > \c_three - \fp_sub:NNNNNNNNN - \l_fp_input_a_integer_int \l_fp_input_a_decimal_int - \l_fp_input_a_extended_int + \fp_trig_sub:NNN \c_six \c_fp_two_pi_decimal_int \c_fp_two_pi_extended_int - \l_fp_input_a_integer_int \l_fp_input_a_decimal_int - \l_fp_input_a_extended_int \tex_expandafter:D \fp_trig_normalise_aux: \tex_else:D \tex_ifnum:D \l_fp_input_a_integer_int > \c_two \tex_ifnum:D \l_fp_input_a_decimal_int > \c_fp_pi_decimal_int - \fp_sub:NNNNNNNNN - \l_fp_input_a_integer_int \l_fp_input_a_decimal_int - \l_fp_input_a_extended_int - \c_six \c_fp_two_pi_decimal_int \c_fp_two_pi_extended_int - \l_fp_input_a_integer_int \l_fp_input_a_decimal_int - \l_fp_input_a_extended_int + \fp_trig_sub:NNN + \c_six \c_fp_two_pi_decimal_int \c_fp_two_pi_extended_int \tex_expandafter:D \tex_expandafter:D \tex_expandafter:D \tex_expandafter:D \tex_expandafter:D \tex_expandafter:D \tex_expandafter:D \fp_trig_normalise_aux: @@ -3417,6 +3411,49 @@ \tex_fi:D } % \end{macrocode} +% Here, there may be a sign change but there will never be any +% variation in the input. So a dedicated function can be used. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \fp_trig_sub:NNN #1#2#3 { + \l_fp_input_a_integer_int + \etex_numexpr:D \l_fp_input_a_integer_int - #1 \scan_stop: + \l_fp_input_a_decimal_int + \etex_numexpr:D \l_fp_input_a_decimal_int - #2 \scan_stop: + \l_fp_input_a_extended_int + \etex_numexpr:D \l_fp_input_a_extended_int - #3 \scan_stop: + \tex_ifnum:D \l_fp_input_a_extended_int < \c_zero + \tex_advance:D \l_fp_input_a_decimal_int \c_minus_one + \tex_advance:D \l_fp_input_a_extended_int \c_one_thousand_million + \tex_fi:D + \tex_ifnum:D \l_fp_input_a_decimal_int < \c_zero + \tex_advance:D \l_fp_input_a_integer_int \c_minus_one + \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million + \tex_fi:D + \tex_ifnum:D \l_fp_input_a_integer_int < \c_zero + \l_fp_input_a_sign_int -\l_fp_input_a_sign_int + \tex_ifnum:D + \etex_numexpr:D + \l_fp_input_a_decimal_int + \l_fp_input_a_extended_int + = \c_zero + \l_fp_input_a_integer_int -\l_fp_input_a_integer_int + \tex_else:D + \l_fp_input_a_integer_int + \etex_numexpr:D + - \l_fp_input_a_integer_int - \c_one + \scan_stop: + \l_fp_input_a_decimal_int + \etex_numexpr:D + \c_one_thousand_million - \l_fp_input_a_decimal_int + \scan_stop: + \l_fp_input_a_extended_int + \etex_numexpr:D + \c_one_thousand_million - \l_fp_input_a_extended_int + \scan_stop: + \tex_fi:D + \tex_fi:D +} +% \end{macrocode} +%\end{macro} %\end{macro} %\end{macro} % @@ -3932,6 +3969,19 @@ } \cs_new_protected_nopar:Npn \fp_tan_aux_ii: { \fp_trig_normalise: + \tex_ifnum:D \l_fp_input_a_sign_int > \c_zero + \tex_ifnum:D \l_fp_trig_octant_int > \c_two + \l_fp_output_sign_int \c_minus_one + \tex_else:D + \l_fp_output_sign_int \c_one + \tex_fi:D + \tex_else:D + \tex_ifnum:D \l_fp_trig_octant_int > \c_two + \l_fp_output_sign_int \c_one + \tex_else:D + \l_fp_output_sign_int \c_minus_one + \tex_fi:D + \tex_fi:D \fp_cos_aux_ii: \tex_ifnum:D \l_fp_input_a_decimal_int = \c_zero \tex_ifnum:D \l_fp_input_a_integer_int = \c_zero @@ -3990,11 +4040,6 @@ \etex_numexpr:D \l_fp_input_a_exponent_int - \l_fp_input_b_exponent_int \scan_stop: - \tex_ifnum:D \l_fp_trig_octant_int < \c_three - \l_fp_output_sign_int \c_one - \tex_else:D - \l_fp_output_sign_int \c_minus_one - \tex_fi:D \fp_standardise:NNNN \l_fp_output_sign_int \l_fp_output_integer_int |