[latex3-commits] [git/LaTeX3-latex3-latex3] master: Make round(., nan)=nan with no "Invalid operation" error (08a1a50c1)

Bruno Le Floch bruno at le-floch.fr
Sun Aug 25 13:59:51 CEST 2019


Repository : https://github.com/latex3/latex3
On branch  : master
Link       : https://github.com/latex3/latex3/commit/08a1a50c1f10ae39663f17e4080c6bee6de24084

>---------------------------------------------------------------

commit 08a1a50c1f10ae39663f17e4080c6bee6de24084
Author: Bruno Le Floch <bruno at le-floch.fr>
Date:   Sun Aug 25 13:57:25 2019 +0200

    Make round(.,nan)=nan with no "Invalid operation" error


>---------------------------------------------------------------

08a1a50c1f10ae39663f17e4080c6bee6de24084
 l3kernel/CHANGELOG.md                   |  4 ++++
 l3kernel/l3fp-aux.dtx                   | 14 ++++++++++++++
 l3kernel/l3fp-round.dtx                 | 18 +++++++++++++++---
 l3kernel/l3fp.dtx                       |  3 ++-
 l3kernel/testfiles/m3expl001.luatex.tlg |  1 +
 l3kernel/testfiles/m3expl001.ptex.tlg   |  1 +
 l3kernel/testfiles/m3expl001.tlg        |  1 +
 l3kernel/testfiles/m3expl001.uptex.tlg  |  1 +
 l3kernel/testfiles/m3expl001.xetex.tlg  |  1 +
 l3kernel/testfiles/m3expl003.luatex.tlg |  1 +
 l3kernel/testfiles/m3expl003.ptex.tlg   |  1 +
 l3kernel/testfiles/m3expl003.tlg        |  1 +
 l3kernel/testfiles/m3expl003.uptex.tlg  |  1 +
 l3kernel/testfiles/m3expl003.xetex.tlg  |  1 +
 l3kernel/testfiles/m3fp-round002.tlg    |  9 ---------
 15 files changed, 45 insertions(+), 13 deletions(-)

diff --git a/l3kernel/CHANGELOG.md b/l3kernel/CHANGELOG.md
index ac12f49b7..5ddc54b27 100644
--- a/l3kernel/CHANGELOG.md
+++ b/l3kernel/CHANGELOG.md
@@ -7,6 +7,10 @@ this project uses date-based 'snapshot' version identifiers.
 
 ## [Unreleased]
 
+### Changed
+
+- Make round(.,nan)=nan with no "Invalid operation" error
+
 ### Fixed
 
 - `\tl_rescan:nn` and `\tl_(g)set_rescan:Nnn` when single-line input
diff --git a/l3kernel/l3fp-aux.dtx b/l3kernel/l3fp-aux.dtx
index 5784ed97b..1dd4cf9a7 100644
--- a/l3kernel/l3fp-aux.dtx
+++ b/l3kernel/l3fp-aux.dtx
@@ -369,6 +369,20 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\@@_kind:w}
+%   Expands to $0$ for zeros, $1$ for normal floating point numbers, $2$
+%   for infinities, $3$ for \nan{}, $4$ for tuples.
+%    \begin{macrocode}
+\cs_new:Npn \@@_kind:w #1
+  {
+    \@@_if_type_fp:NTwFw
+      #1 \@@_use_ii_until_s:nnw
+      \s_@@ { \@@_use_i_until_s:nw 4 }
+      \q_stop
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Overflow, underflow, and exact zero}
 %
 %^^A todo: the sign of exact zeros should depend on the rounding mode.
diff --git a/l3kernel/l3fp-round.dtx b/l3kernel/l3fp-round.dtx
index 5610b11fc..98a010399 100644
--- a/l3kernel/l3fp-round.dtx
+++ b/l3kernel/l3fp-round.dtx
@@ -483,14 +483,26 @@
 %     \@@_round_special:NwwNnn ,
 %     \@@_round_special_aux:Nw
 %   }
+%   If the number of digits to round to is an integer or infinity all is
+%   good; if it is \texttt{nan} then just produce a \texttt{nan};
+%   otherwise invalid as we have something like |round(1,3.14)| where
+%   the number of digits is not an integer.
 %    \begin{macrocode}
 \cs_new:Npn \@@_round:Nww #1#2 ; #3 ;
   {
     \@@_small_int:wTF #3; { \@@_round:Nwn #1#2; }
       {
-        \@@_invalid_operation_tl_o:ff
-          { \@@_round_name_from_cs:N #1 }
-          { \@@_array_to_clist:n { #2; #3; } }
+        \if:w 3 \@@_kind:w #3 ;
+          \exp_after:wN \use_i:nn
+        \else:
+          \exp_after:wN \use_ii:nn
+        \fi:
+        { \exp_after:wN \c_nan_fp }
+        {
+          \@@_invalid_operation_tl_o:ff
+            { \@@_round_name_from_cs:N #1 }
+            { \@@_array_to_clist:n { #2; #3; } }
+        }
       }
   }
 \cs_new:Npn \@@_round:Nwn #1 \s_@@ \@@_chk:w #2#3#4; #5
diff --git a/l3kernel/l3fp.dtx b/l3kernel/l3fp.dtx
index 2ded33aed..c8c360b41 100644
--- a/l3kernel/l3fp.dtx
+++ b/l3kernel/l3fp.dtx
@@ -1089,6 +1089,7 @@
 %   $x$~to $n$~places.  If $n$~is an integer, this rounds~$x$ to a
 %   multiple of~$10^{-n}$; if $n=+\infty$, this always yields~$x$; if
 %   $n=-\infty$, this yields one of $\pm 0$, $\pm\infty$, or~\nan{}; if
+%   $n=\nan{}$, this yields \nan{}; if
 %   $n$~is neither $\pm\infty$ nor an integer, then an \enquote{invalid
 %     operation} exception is raised.  When \meta{fpexpr_2} is omitted,
 %   $n=0$, \emph{i.e.}, \meta{fpexpr_1} is rounded to an integer.  The
@@ -1096,7 +1097,7 @@
 %   \begin{itemize}
 %     \item |round| yields the multiple of~$10^{-n}$ closest to~$x$,
 %       with ties ($x$ half-way between two such multiples) rounded
-%       as follows.  If $t$ is \texttt{nan} or not given the even
+%       as follows.  If $t$ is \texttt{nan} (or not given) the even
 %       multiple is chosen (\enquote{ties to even}), if $t=\pm 0$ the
 %       multiple closest to $0$ is chosen (\enquote{ties to zero}),
 %       if $t$ is positive/negative the multiple closest to $\infty$/$-\infty$ is chosen
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index 941c8e8a3..791f928e3 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -3533,6 +3533,7 @@ Defining \__fp_zero_fp:N on line ...
 Defining \__fp_inf_fp:N on line ...
 Defining \__fp_exponent:w on line ...
 Defining \__fp_neg_sign:N on line ...
+Defining \__fp_kind:w on line ...
 Defining \__fp_sanitize:Nw on line ...
 Defining \__fp_sanitize:wN on line ...
 Defining \__fp_sanitize_zero:w on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 5acffa899..fe937efd9 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -3787,6 +3787,7 @@ Defining \__fp_zero_fp:N on line ...
 Defining \__fp_inf_fp:N on line ...
 Defining \__fp_exponent:w on line ...
 Defining \__fp_neg_sign:N on line ...
+Defining \__fp_kind:w on line ...
 Defining \__fp_sanitize:Nw on line ...
 Defining \__fp_sanitize:wN on line ...
 Defining \__fp_sanitize_zero:w on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index fc9787ea5..302bd8c2d 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -3787,6 +3787,7 @@ Defining \__fp_zero_fp:N on line ...
 Defining \__fp_inf_fp:N on line ...
 Defining \__fp_exponent:w on line ...
 Defining \__fp_neg_sign:N on line ...
+Defining \__fp_kind:w on line ...
 Defining \__fp_sanitize:Nw on line ...
 Defining \__fp_sanitize:wN on line ...
 Defining \__fp_sanitize_zero:w on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index 0d6b19679..4ec41fd4a 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -3787,6 +3787,7 @@ Defining \__fp_zero_fp:N on line ...
 Defining \__fp_inf_fp:N on line ...
 Defining \__fp_exponent:w on line ...
 Defining \__fp_neg_sign:N on line ...
+Defining \__fp_kind:w on line ...
 Defining \__fp_sanitize:Nw on line ...
 Defining \__fp_sanitize:wN on line ...
 Defining \__fp_sanitize_zero:w on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index 2cae92902..7d58592c9 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -3531,6 +3531,7 @@ Defining \__fp_zero_fp:N on line ...
 Defining \__fp_inf_fp:N on line ...
 Defining \__fp_exponent:w on line ...
 Defining \__fp_neg_sign:N on line ...
+Defining \__fp_kind:w on line ...
 Defining \__fp_sanitize:Nw on line ...
 Defining \__fp_sanitize:wN on line ...
 Defining \__fp_sanitize_zero:w on line ...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index 941c8e8a3..791f928e3 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -3533,6 +3533,7 @@ Defining \__fp_zero_fp:N on line ...
 Defining \__fp_inf_fp:N on line ...
 Defining \__fp_exponent:w on line ...
 Defining \__fp_neg_sign:N on line ...
+Defining \__fp_kind:w on line ...
 Defining \__fp_sanitize:Nw on line ...
 Defining \__fp_sanitize:wN on line ...
 Defining \__fp_sanitize_zero:w on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index 5acffa899..fe937efd9 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -3787,6 +3787,7 @@ Defining \__fp_zero_fp:N on line ...
 Defining \__fp_inf_fp:N on line ...
 Defining \__fp_exponent:w on line ...
 Defining \__fp_neg_sign:N on line ...
+Defining \__fp_kind:w on line ...
 Defining \__fp_sanitize:Nw on line ...
 Defining \__fp_sanitize:wN on line ...
 Defining \__fp_sanitize_zero:w on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index fc9787ea5..302bd8c2d 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -3787,6 +3787,7 @@ Defining \__fp_zero_fp:N on line ...
 Defining \__fp_inf_fp:N on line ...
 Defining \__fp_exponent:w on line ...
 Defining \__fp_neg_sign:N on line ...
+Defining \__fp_kind:w on line ...
 Defining \__fp_sanitize:Nw on line ...
 Defining \__fp_sanitize:wN on line ...
 Defining \__fp_sanitize_zero:w on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index 0d6b19679..4ec41fd4a 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -3787,6 +3787,7 @@ Defining \__fp_zero_fp:N on line ...
 Defining \__fp_inf_fp:N on line ...
 Defining \__fp_exponent:w on line ...
 Defining \__fp_neg_sign:N on line ...
+Defining \__fp_kind:w on line ...
 Defining \__fp_sanitize:Nw on line ...
 Defining \__fp_sanitize:wN on line ...
 Defining \__fp_sanitize_zero:w on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index 2cae92902..7d58592c9 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -3531,6 +3531,7 @@ Defining \__fp_zero_fp:N on line ...
 Defining \__fp_inf_fp:N on line ...
 Defining \__fp_exponent:w on line ...
 Defining \__fp_neg_sign:N on line ...
+Defining \__fp_kind:w on line ...
 Defining \__fp_sanitize:Nw on line ...
 Defining \__fp_sanitize:wN on line ...
 Defining \__fp_sanitize_zero:w on line ...
diff --git a/l3kernel/testfiles/m3fp-round002.tlg b/l3kernel/testfiles/m3fp-round002.tlg
index 00eb61b10..79b8c94b0 100644
--- a/l3kernel/testfiles/m3fp-round002.tlg
+++ b/l3kernel/testfiles/m3fp-round002.tlg
@@ -42,15 +42,6 @@ spelling (e.g., `I\hbox'). Otherwise just continue,
 and I'll forget about whatever was undefined.
 ! Undefined control sequence.
 <argument> \LaTeX3 error: 
-                           Invalid operation round(1, nan)
-l. ...  }
-The control sequence at the end of the top line
-of your error message was never \def'ed. If you have
-misspelled it (e.g., `\hobx'), type `I' and the correct
-spelling (e.g., `I\hbox'). Otherwise just continue,
-and I'll forget about whatever was undefined.
-! Undefined control sequence.
-<argument> \LaTeX3 error: 
                            Missing number before ','.
 l. ...  }
 The control sequence at the end of the top line





More information about the latex3-commits mailing list