<!DOCTYPE html>
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Hi,</p>
    <p>this is a patch to add the base of the natural logarithm as a new
      constant EulerNum, and ensure that log(EulerNum) evaluates to 1.</p>
    <p>Of course, exp(1) will do fine for calculations. But for
      printing, it is nicer to see e^x instead of exp(1)^x or 2.718^x.</p>
    <p>Hope this is useful.</p>
    <p>Jan</p>
    <p>---<br>
       ginac/constant.cpp      | 5 +++++<br>
       ginac/constant.h        | 1 +<br>
       ginac/inifcns_trans.cpp | 3 +++<br>
       ginac/numeric.cpp       | 5 +++++<br>
       ginac/numeric.h         | 1 +<br>
       ginsh/ginsh_lexer.lpp   | 1 +<br>
       6 files changed, 16 insertions(+)<br>
      <br>
      diff --git a/ginac/constant.cpp b/ginac/constant.cpp<br>
      index a89711ef..60af44bc 100644<br>
      --- a/ginac/constant.cpp<br>
      +++ b/ginac/constant.cpp<br>
      @@ -91,6 +91,8 @@ void <a class="moz-txt-link-freetext" href="constant::read_archive(const">constant::read_archive(const</a> archive_node
      &n, lst &sym_lst)<br>
                   *this = Catalan;<br>
               else if (s == Euler.name)<br>
                   *this = Euler;<br>
      +        else if (s == EulerNum.name)<br>
      +            *this = EulerNum;<br>
               else<br>
                   throw (<a class="moz-txt-link-freetext" href="std::runtime_error(">std::runtime_error(</a>"unknown constant '" + s +
      "' in archive"));<br>
           } else<br>
      @@ -254,4 +256,7 @@ const constant Euler("Euler", EulerEvalf,
      "\\gamma_E", <a class="moz-txt-link-freetext" href="domain::positive">domain::positive</a>);<br>
       /** Catalan's constant. (0.91597...)  Diverts straight into CLN
      for evalf(). */<br>
       const constant Catalan("Catalan", CatalanEvalf, "G",
      <a class="moz-txt-link-freetext" href="domain::positive">domain::positive</a>);<br>
       <br>
      +/** Base of the natural logarithm */<br>
      +const constant EulerNum("EulerNum", EulerNumEvalf, "\\mathit{e}",
      <a class="moz-txt-link-freetext" href="domain::positive">domain::positive</a>);<br>
      +<br>
       } // namespace GiNaC<br>
      diff --git a/ginac/constant.h b/ginac/constant.h<br>
      index 92d07941..24839d46 100644<br>
      --- a/ginac/constant.h<br>
      +++ b/ginac/constant.h<br>
      @@ -82,6 +82,7 @@ GINAC_DECLARE_UNARCHIVER(constant);<br>
       extern const constant Pi;<br>
       extern const constant Catalan;<br>
       extern const constant Euler;<br>
      +extern const constant EulerNum;<br>
       <br>
       } // namespace GiNaC<br>
       <br>
      diff --git a/ginac/inifcns_trans.cpp b/ginac/inifcns_trans.cpp<br>
      index 6f577bae..ef5f52f1 100644<br>
      --- a/ginac/inifcns_trans.cpp<br>
      +++ b/ginac/inifcns_trans.cpp<br>
      @@ -202,6 +202,9 @@ static ex log_eval(const ex & x)<br>
                   return log(ex_to<numeric>(x));<br>
           }<br>
       <br>
      +    if (x.is_equal(EulerNum))<br>
      +            return *_num1_p;<br>
      +<br>
           // log(exp(t)) -> t (if -Pi < t.imag() <= Pi):<br>
           if (is_ex_the_function(x, exp)) {<br>
               const ex &t = x.op(0);<br>
      diff --git a/ginac/numeric.cpp b/ginac/numeric.cpp<br>
      index 6da79977..addc012d 100644<br>
      --- a/ginac/numeric.cpp<br>
      +++ b/ginac/numeric.cpp<br>
      @@ -2515,6 +2515,11 @@ ex CatalanEvalf()<br>
           return numeric(<a class="moz-txt-link-freetext" href="cln::catalanconst(cln::default_float_format))">cln::catalanconst(cln::default_float_format))</a>;<br>
       }<br>
       <br>
      +/** Floating point evaluation of base of natural logarithm. */<br>
      +ex EulerNumEvalf()<br>
      +{<br>
      +    return exp(*_num1_p); // Suggestion by Vladimir Kisil on
      ginac-devel<br>
      +}<br>
       <br>
       /** _numeric_digits default ctor, checking for singleton
      invariance. */<br>
       _numeric_<a class="moz-txt-link-freetext" href="digits::_numeric_digits()">digits::_numeric_digits()</a><br>
      diff --git a/ginac/numeric.h b/ginac/numeric.h<br>
      index 0673d9a5..d25670f9 100644<br>
      --- a/ginac/numeric.h<br>
      +++ b/ginac/numeric.h<br>
      @@ -325,6 +325,7 @@ inline const numeric denom(const numeric
      &x)<br>
       ex PiEvalf();<br>
       ex EulerEvalf();<br>
       ex CatalanEvalf();<br>
      +ex EulerNumEvalf();<br>
       <br>
       <br>
       } // namespace GiNaC<br>
      diff --git a/ginsh/ginsh_lexer.lpp b/ginsh/ginsh_lexer.lpp<br>
      index 6e0732e7..bcfecd10 100644<br>
      --- a/ginsh/ginsh_lexer.lpp<br>
      +++ b/ginsh/ginsh_lexer.lpp<br>
      @@ -75,6 +75,7 @@ AN    [0-9a-zA-Z_]<br>
       Pi            yylval = Pi; return T_LITERAL;<br>
       Euler            yylval = Euler; return T_LITERAL;<br>
       Catalan            yylval = Catalan; return T_LITERAL;<br>
      +EulerNum        yylval = EulerNum; return T_LITERAL;<br>
       FAIL            yylval = *new fail(); return T_LITERAL;<br>
       I            yylval = I; return T_NUMBER;<br>
       Digits            yylval = (long)Digits; return T_DIGITS;<br>
      -- <br>
      2.43.0</p>
    <p><br>
    </p>
  </body>
</html>