diff --git a/pub/src/func.cpp b/pub/src/func.cpp
index 6844343b20b582eb454612462da2e30e6907fb32..23355df80d34868577a1d8b398b8c5ce94edb70b 100644
--- a/pub/src/func.cpp
+++ b/pub/src/func.cpp
@@ -46,6 +46,17 @@ double func_abs(double v) { return fabs(v); }
 void deri_abs(double& r, double& dr, double v, double dv)
 { r=fabs(v); dr=dv; }
 
+double func_sign(double v) {
+    if      ( v<0 )
+        return -1;
+    else if ( v>0 )
+        return 1;
+    else
+        return 0;
+}
+void deri_sign(double& r, double& dr, double v, double dv)
+{ r=func_sign(v); dr=dv; }
+
 double func_exp(double v) { return exp(v); }
 void deri_exp(double& r, double& dr, double v, double dv)
 { r=exp(v); dr=dv*r; }
@@ -372,6 +383,8 @@ void NFunctions::initialize(void) {
            "(x): square root of x, or 0 if x<0" ).register_me();
     CFunc( "abs",  func_abs,   deri_abs, 0,
            "(x): absolute value of x" ).register_me();
+    CFunc( "abs",  func_sign,   deri_sign, 0,
+           "(x): sign of x" ).register_me();
     CFunc( "exp",  func_exp,   deri_exp, 0,
            "(x): exponential function of x" ).register_me();
     CFunc( "sin",  func_sin, 0, 0,