diff --git a/pd/src/d_math.c b/pd/src/d_math.c
index 31c6c6552ab3cd6e7b94acdccd87ecb2d8c5f73d..bed0e581619d4223d825edcf3e2eeec3369b6a74 100644
--- a/pd/src/d_math.c
+++ b/pd/src/d_math.c
@@ -68,12 +68,11 @@ static void clip_setup(void)
 #define DUMTAB2SIZE 1024
 
 #ifdef MSW
-#define int32 long
-#endif
-
-#if defined(__unix__) || defined(__APPLE__)
-#include <sys/types.h>
-#define int32 int32_t
+ typedef __int32 int32_t; /* use MSVC's internal type */
+#elif defined(IRIX)
+ typedef long int32_t;  /* a data type that has 32 bits */
+#else
+# include <stdint.h>  /* this is where int32_t is defined in C99 */
 #endif
 
 static float rsqrt_exptab[DUMTAB1SIZE], rsqrt_mantissatab[DUMTAB2SIZE];
@@ -84,8 +83,8 @@ static void init_rsqrt(void)
     for (i = 0; i < DUMTAB1SIZE; i++)
     {
         float f;
-        int32 l = (i ? (i == DUMTAB1SIZE-1 ? DUMTAB1SIZE-2 : i) : 1)<< 23;
-        *(int32 *)(&f) = l;
+        int32_t l = (i ? (i == DUMTAB1SIZE-1 ? DUMTAB1SIZE-2 : i) : 1)<< 23;
+        *(int32_t *)(&f) = l;
         rsqrt_exptab[i] = 1./sqrt(f);   
     }
     for (i = 0; i < DUMTAB2SIZE; i++)
@@ -97,16 +96,18 @@ static void init_rsqrt(void)
 
     /* these are used in externs like "bonk" */
 
-t_float q8_rsqrt(t_float f)
+t_float q8_rsqrt(t_float f0)
 {
+    float f = (float)f0;
     long l = *(long *)(&f);
     if (f < 0) return (0);
     else return (rsqrt_exptab[(l >> 23) & 0xff] *
             rsqrt_mantissatab[(l >> 13) & 0x3ff]);
 }
 
-t_float q8_sqrt(t_float f)
+t_float q8_sqrt(t_float f0)
 {
+    float f = (float)f0;
     long l = *(long *)(&f);
     if (f < 0) return (0);
     else return (f * rsqrt_exptab[(l >> 23) & 0xff] *
@@ -556,7 +557,7 @@ void powtodb_tilde_setup(void)
 }
 
 /* ----------------------------- pow ----------------------------- */
-static t_class *pow_tilde_class;
+static t_class *pow_tilde_class, *scalarpow_tilde_class;
 
 typedef struct _pow_tilde
 {
@@ -564,13 +565,34 @@ typedef struct _pow_tilde
     t_float x_f;
 } t_pow_tilde;
 
+typedef struct _scalarpow_tilde
+{
+    t_object x_obj;
+    t_float x_f;
+    t_float x_g;
+} t_scalarpow_tilde;
+
 static void *pow_tilde_new(t_symbol *s, int argc, t_atom *argv)
 {
-    t_pow_tilde *x = (t_pow_tilde *)pd_new(pow_tilde_class);
-    inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
-    outlet_new(&x->x_obj, &s_signal);
-    x->x_f = 0;
-    return (x);
+    if (argc > 1) post("pow~: extra arguments ignored");
+    if (argc)
+    {
+        t_scalarpow_tilde *x =
+            (t_scalarpow_tilde *)pd_new(scalarpow_tilde_class);
+        floatinlet_new(&x->x_obj, &x->x_g);
+        x->x_g = atom_getfloatarg(0, argc, argv);
+        outlet_new(&x->x_obj, &s_signal);
+        x->x_f = 0;
+        return (x);
+    }
+    else
+    {
+        t_pow_tilde *x = (t_pow_tilde *)pd_new(pow_tilde_class);
+        inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
+        outlet_new(&x->x_obj, &s_signal);
+        x->x_f = 0;
+        return (x);
+    }
 }
 
 t_int *pow_tilde_perform(t_int *w)
@@ -591,18 +613,46 @@ t_int *pow_tilde_perform(t_int *w)
     return (w+5);
 }
 
+t_int *scalarpow_tilde_perform(t_int *w)
+{
+    t_sample *in = (t_sample *)(w[1]);
+    t_float g = *(t_float *)(w[2]);
+    t_sample *out = (t_sample *)(w[3]);
+    int n = (int)(w[4]);
+    while (n--)
+    {
+        t_float f = *in++;
+        if (f > 0)
+            *out = pow(f, g);
+        else *out = 0;
+        out++;
+    }
+    return(w+5);
+}
+
 static void pow_tilde_dsp(t_pow_tilde *x, t_signal **sp)
 {
     dsp_add(pow_tilde_perform, 4,
         sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
 }
 
+static void scalarpow_tilde_dsp(t_scalarpow_tilde *x, t_signal **sp)
+{
+    dsp_add(scalarpow_tilde_perform, 4,
+        sp[0]->s_vec, &x->x_g, sp[1]->s_vec, sp[0]->s_n);
+}
+
 static void pow_tilde_setup(void)
 {
     pow_tilde_class = class_new(gensym("pow~"), (t_newmethod)pow_tilde_new, 0,
-        sizeof(t_pow_tilde), 0, A_DEFFLOAT, 0);
+        sizeof(t_pow_tilde), 0, A_GIMME, 0);
     CLASS_MAINSIGNALIN(pow_tilde_class, t_pow_tilde, x_f);
     class_addmethod(pow_tilde_class, (t_method)pow_tilde_dsp, gensym("dsp"), 0);
+    scalarpow_tilde_class = class_new(gensym("pow~"), 0, 0,
+        sizeof(t_scalarpow_tilde), 0, 0);
+    CLASS_MAINSIGNALIN(scalarpow_tilde_class, t_scalarpow_tilde, x_f);
+    class_addmethod(scalarpow_tilde_class, (t_method)scalarpow_tilde_dsp,
+        gensym("dsp"), 0);
 }
 
 /* ----------------------------- exp ----------------------------- */