[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