diff --git a/doc/eval.texi b/doc/eval.texi
index b41f31ec26ea113e249a12da738b693b91ce85cb..18d848749a0fb8db244ea6208a3fc200486667f9 100644
--- a/doc/eval.texi
+++ b/doc/eval.texi
@@ -99,6 +99,16 @@ Return the greatest common divisor of @var{x} and @var{y}. If both @var{x} and
 @var{y} are 0 or either or both are less than zero then behavior is undefined.
 @end table
 
+The following constants are available:
+@table @option
+@item PI
+area of the unit disc, approximatively 3.14
+@item E
+exp(1) (Euler's number), approximatively 2.718
+@item PHI
+golden ratio (1+sqrt(5))/2, approximatively 1.618
+@end table
+
 Note that:
 
 @code{*} works like AND
diff --git a/libavutil/eval.c b/libavutil/eval.c
index 0c61ad072bb3258f2b2aa264183e44b13f20cf1d..3a8b60d5052d4fe0926c7ffafe89de02670bb68d 100644
--- a/libavutil/eval.c
+++ b/libavutil/eval.c
@@ -72,6 +72,15 @@ static const int8_t si_prefixes['z' - 'E' + 1] = {
     ['Y'-'E']=  24,
 };
 
+static const struct {
+    const char *name;
+    double value;
+} constants[] = {
+    { "E",   M_E   },
+    { "PI",  M_PI  },
+    { "PHI", M_PHI },
+};
+
 double av_strtod(const char *numstr, char **tail)
 {
     double d;
@@ -233,6 +242,15 @@ static int parse_primary(AVExpr **e, Parser *p)
             return 0;
         }
     }
+    for (i = 0; i < FF_ARRAY_ELEMS(constants); i++) {
+        if (strmatch(p->s, constants[i].name)) {
+            p->s += strlen(constants[i].name);
+            d->type = e_value;
+            d->value = constants[i].value;
+            *e = d;
+            return 0;
+        }
+    }
 
     p->s= strchr(p->s, '(');
     if (p->s==NULL) {