% \iffalse meta-comment % %% File: xfp.dtx % % Copyright (C) 2017-2024 The LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this % license or (at your option) any later version. The latest version % of this license is in the file % % https://www.latex-project.org/lppl.txt % % This file is part of the "l3packages bundle" (The Work in LPPL) % and all files in that bundle must be distributed together. % % ----------------------------------------------------------------------- % % The development version of the bundle can be found at % % https://github.com/latex3/latex3 % % for those people who are interested. % %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. \RequirePackage{expl3}[2018/02/21] %\@ifpackagelater{expl3}{2018/02/21} % {} % {% % \PackageError{xfp}{Support package l3kernel too old} % {% % Please install an up to date version of l3kernel\MessageBreak % using your TeX package manager or from CTAN.\MessageBreak % \MessageBreak % Loading xfp will abort!% % }% % \endinput % } % %<*driver> \documentclass[full]{l3doc} \usepackage{amstext} \begin{document} \DocInput{\jobname.dtx} \end{document} % % \fi % % \providecommand\nan{\texttt{NaN}} % % \title{^^A % The \pkg{xfp} package\\ Floating Point Unit^^A % } % % \author{^^A % The \LaTeX{} Project\thanks % {^^A % E-mail: % \href{mailto:latex-team@latex-project.org} % {latex-team@latex-project.org}^^A % }^^A % } % % \date{Released 2024-03-14} % % \maketitle % % \begin{documentation} % % The two functions provided by this package are part of the \LaTeX{} % format starting with 2022-06-01 release. This package is % therefore no longer needed and only provided to be able to % process older documents loading. % % This package provides a \LaTeXe{} document-level interface to the \LaTeX{}3 % floating point unit (part of \pkg{expl3}). It also provides a parallel % integer expression interface for convenience. % % \begin{function}[EXP]{\fpeval} % The expandable command \cs{fpeval} takes as its argument a floating % point expression and produces a result using the normal rules of % mathematics. As this command is expandable it can be used where \TeX{} % requires a number and for example within a low-level \cs{edef} operation % to give a purely numerical result. % \end{function} % % Briefly, the floating point expressions may comprise: % \begin{itemize} % \item Basic arithmetic: addition $x+y$, subtraction $x-y$, % multiplication $x*y$, division $x/y$, square root~$\sqrt{x}$, % and parentheses. % \item Comparison operators: $x\mathop{\mathtt{<}}y$, % $x\mathop{\mathtt{<=}}y$, $x\mathop{\mathtt{>?}}y$, % $x\mathop{\mathtt{!=}}y$ \emph{etc.} % \item Boolean logic: sign $\operatorname{sign} x$, % negation $\mathop{!}x$, conjunction % $x\mathop{\&\&}y$, disjunction $x\mathop{\vert\vert}y$, ternary % operator $x\mathop{?}y\mathop{:}z$. % \item Exponentials: $\exp x$, $\ln x$, $x^y$. % \item Integer factorial: $\operatorname{fact} x$. % \item Trigonometry: $\sin x$, $\cos x$, $\tan x$, $\cot x$, $\sec % x$, $\csc x$ expecting their arguments in radians, and % $\operatorname{sind} x$, $\operatorname{cosd} x$, % $\operatorname{tand} x$, $\operatorname{cotd} x$, % $\operatorname{secd} x$, $\operatorname{cscd} x$ expecting their % arguments in degrees. % \item Inverse trigonometric functions: $\operatorname{asin} x$, % $\operatorname{acos} x$, $\operatorname{atan} x$, % $\operatorname{acot} x$, $\operatorname{asec} x$, % $\operatorname{acsc} x$ giving a result in radians, and % $\operatorname{asind} x$, $\operatorname{acosd} x$, % $\operatorname{atand} x$, $\operatorname{acotd} x$, % $\operatorname{asecd} x$, $\operatorname{acscd} x$ giving a result % in degrees. % \item Extrema: $\max(x_{1},x_{2},\ldots)$, $\min(x_{1},x_{2},\ldots)$, % $\operatorname{abs}(x)$. % \item Rounding functions, controlled by two optional % values, $n$ (number of places, $0$ by default) and % $t$ (behavior on a tie, $\nan$ by default): % \begin{itemize} % \item $\operatorname{trunc}(x,n)$ rounds towards zero, % \item $\operatorname{floor}(x,n)$ rounds towards~$-\infty$, % \item $\operatorname{ceil}(x,n)$ rounds towards~$+\infty$, % \item $\operatorname{round}(x,n,t)$ rounds to the closest value, with % ties rounded to an even value by default, towards zero if $t=0$, % towards $+\infty$ if $t>0$ and towards $-\infty$ if $t<0$. % \end{itemize} % \item Random numbers: $\mathop{rand}()$, $\mathop{randint}(m,n)$. % \item Constants: \texttt{pi}, \texttt{deg} (one degree in radians). % \item Dimensions, automatically expressed in points, \emph{e.g.}, % \texttt{pc} is~$12$. % \item Automatic conversion (no need for \cs{number}) of % integer, dimension, and skip variables to floating points numbers, % expressing dimensions in points and ignoring the stretch and % shrink components of skips. % \item Tuples: $(x_1,\ldots{},x_n)$ that can be added together, % multiplied or divided by a floating point number, and nested. % \end{itemize} % % An example of use could be the following. % \begin{verbatim} % \LaTeX{} can now compute: $ \frac{\sin (3.5)}{2} + 2\cdot 10^{-3} % = \fpeval{sin(3.5)/2 + 2e-3} $. % \end{verbatim} % % \begin{function}[EXP]{\inteval} % The expandable command \cs{inteval} takes as its argument an integer % expression and produces a result using the normal rules of % mathematics. The operations recognised are |+|, |-|, |*| and |/| plus % parentheses. Division occurs with \emph{rounding}, and ties are rounded % away from zero. As this command is % expandable it can be used where \TeX{} requires a number and for example % within a low-level \cs{edef} operation to give a purely numerical result. % \end{function} % % An example of use could be the following. % \begin{verbatim} % \LaTeX{} can now compute: The sum of the numbers is $\inteval{1 + 2 + 3}$. % \end{verbatim} % % \end{documentation} % % \begin{implementation} % % \section{\pkg{xfp} implementation} % % \begin{macrocode} %<*package> % \end{macrocode} % % \begin{macrocode} \ProvidesExplPackage{xfp}{2024-03-14}{} {L3 Floating point unit} % \end{macrocode} % % \begin{macro}{\fpeval} % A document level wrapper around the code level function. This % definition will be moved to the \LaTeXe{} format so we just % ``provide'' it in case this package gets loaded in documents % processed with a new format. % \begin{macrocode} \ProvideExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} } % \end{macrocode} % \end{macro} % % \begin{macro}{\inteval} % A second one, this time around an \eTeX{} primitive. % \begin{macrocode} \ProvideExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} } % \end{macrocode} % \end{macro} % % \begin{macrocode} % % \end{macrocode} % % \end{implementation} % % \PrintIndex