summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/expl3/l3fp.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/expl3/l3fp.dtx')
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3fp.dtx83
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