<!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>