Commit 310cf1fc authored by Pranay Gupta's avatar Pranay Gupta
Browse files

support for math functions on double values added

parent 92ccd578
......@@ -11,42 +11,29 @@ inputs to int and their outputs back to float. */
#include "m_pd.h"
#include <math.h>
#if !defined(HAVE_SINF)
#define sinf sin
#endif
#if !defined(HAVE_COSF)
#define cosf cos
#endif
#if !defined(HAVE_ATANF)
#define atanf atan
#endif
#if !defined(HAVE_ATAN2F)
#define atan2f atan2
#endif
#if !defined(HAVE_SQRTF)
#define sqrtf sqrt
#endif
#if !defined(HAVE_LOGF)
#define logf log
#endif
#if !defined(HAVE_EXPF)
#define expf exp
#endif
#if !defined(HAVE_FABSF)
#define fabsf fabs
#endif
#if !defined(HAVE_POWF)
#define powf pow
#if PD_FLOATSIZE == 32
#define POW powf
#define SIN sinf
#define COS cosf
#define ATAN atanf
#define ATAN2 atan2f
#define SQRT sqrtf
#define LOG logf
#define EXP expf
#define FABS fabsf
#define MAXLOG 87.3365
#elif PD_FLOATSIZE == 64
#define POW pow
#define SIN sin
#define COS cos
#define ATAN atan
#define ATAN2 atan2
#define SQRT sqrt
#define LOG log
#define EXP exp
#define FABS fabs
#define MAXLOG 87.3365
#endif
typedef struct _binop
{
t_object x_obj;
......@@ -158,10 +145,10 @@ static void binop1_pow_bang(t_binop *x)
{
if (x->x_f1 >= 0)
outlet_float(x->x_obj.ob_outlet,
powf(x->x_f1, x->x_f2));
POW(x->x_f1, x->x_f2));
else if (x->x_f2 <= -1 || x->x_f2 >= 1 || x->x_f2 == 0)
outlet_float(x->x_obj.ob_outlet,
powf(x->x_f1, x->x_f2));
POW(x->x_f1, x->x_f2));
else
{
pd_error(x, "pow: calculation resulted in a NaN");
......@@ -174,10 +161,10 @@ static void binop1_pow_float(t_binop *x, t_float f)
x->x_f1 = f;
if (x->x_f1 >= 0)
outlet_float(x->x_obj.ob_outlet,
powf(x->x_f1, x->x_f2));
POW(x->x_f1, x->x_f2));
else if (x->x_f2 <= -1 || x->x_f2 >= 1 || x->x_f2 == 0)
outlet_float(x->x_obj.ob_outlet,
powf(x->x_f1, x->x_f2));
POW(x->x_f1, x->x_f2));
else {
pd_error(x, "pow: calculation resulted in a NaN");
outlet_float(x->x_obj.ob_outlet, 0);
......@@ -564,7 +551,7 @@ static void *sin_new(void)
static void sin_float(t_object *x, t_float f)
{
outlet_float(x->ob_outlet, sinf(f));
outlet_float(x->ob_outlet, SIN(f));
}
static t_class *cos_class; /* ----------- cos --------------- */
......@@ -578,7 +565,7 @@ static void *cos_new(void)
static void cos_float(t_object *x, t_float f)
{
outlet_float(x->ob_outlet, cosf(f));
outlet_float(x->ob_outlet, COS(f));
}
static t_class *tan_class; /* ----------- tan --------------- */
......@@ -592,8 +579,8 @@ static void *tan_new(void)
static void tan_float(t_object *x, t_float f)
{
t_float c = cosf(f);
t_float t = (c == 0 ? 0 : sinf(f)/c);
t_float c = COS(f);
t_float t = (c == 0 ? 0 : SIN(f)/c);
outlet_float(x->ob_outlet, t);
}
......@@ -608,7 +595,7 @@ static void *atan_new(void)
static void atan_float(t_object *x, t_float f)
{
outlet_float(x->ob_outlet, atanf(f));
outlet_float(x->ob_outlet, ATAN(f));
}
static t_class *atan2_class; /* ----------- atan2 --------------- */
......@@ -630,7 +617,7 @@ static void *atan2_new(void)
static void atan2_float(t_atan2 *x, t_float f)
{
t_float r = (f == 0 && x->x_f == 0 ? 0 : atan2f(f, x->x_f));
t_float r = (f == 0 && x->x_f == 0 ? 0 : ATAN2(f, x->x_f));
outlet_float(x->x_ob.ob_outlet, r);
}
......@@ -645,7 +632,7 @@ static void *sqrt_new(void)
static void sqrt_float(t_object *x, t_float f)
{
t_float r = (f > 0 ? sqrtf(f) : 0);
t_float r = (f > 0 ? SQRT(f) : 0);
outlet_float(x->ob_outlet, r);
}
......@@ -660,7 +647,7 @@ static void *log_new(void)
static void log_float(t_object *x, t_float f)
{
t_float r = (f > 0 ? logf(f) : -1000);
t_float r = (f > 0 ? LOG(f) : -1000);
outlet_float(x->ob_outlet, r);
}
......@@ -678,7 +665,7 @@ static void exp_float(t_object *x, t_float f)
{
t_float g;
if (f > MAXLOG) f = MAXLOG;
g = expf(f);
g = EXP(f);
outlet_float(x->ob_outlet, g);
}
......@@ -693,7 +680,7 @@ static void *abs_new(void)
static void abs_float(t_object *x, t_float f)
{
outlet_float(x->ob_outlet, fabsf(f));
outlet_float(x->ob_outlet, FABS(f));
}
static t_class *wrap_class; /* ----------- wrap --------------- */
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment