#include <math.h>
#include <errno.h>
#include <stdio.h>
-#include "approx.h"
#include "data-in.h"
#include "error.h"
#include "julcal/julcal.h"
#include "magic.h"
+#include "misc.h"
#include "pool.h"
#include "random.h"
#include "stats.h"
#include "vfmP.h"
double
-expr_evaluate (struct expression *e, struct ccase *c, union value *v)
+expr_evaluate (struct expression *e, const struct ccase *c, int case_num,
+ union value *v)
{
unsigned char *op = e->op;
double *dbl = e->num;
sp--;
if (sp[0].f == SYSMIS)
{
- if (approx_eq (sp[1].f, 0.0))
+ if (sp[1].f == 0.0)
sp->f = 1.0;
}
else if (sp[1].f == SYSMIS)
else
sp->f = SYSMIS;
}
- else if (approx_eq (sp[0].f, 0.0) && approx_eq (sp[1].f, 0.0))
+ else if (sp[0].f == 0.0 && sp[1].f == 0.0)
sp->f = SYSMIS;
else
sp->f = pow (sp[0].f, sp[1].f);
break;
case OP_AND:
- /* Note that the equality operator (==) may be used here
- (instead of approx_eq) because booleans are always
- *exactly* 0, 1, or SYSMIS.
+ /* Note that booleans are always one of 0, 1, or SYSMIS.
Truth table (in order of detection):
if (sp[1].f == SYSMIS)
sp->f = SYSMIS;
else
- sp->f = approx_eq (sp[0].f, sp[1].f);
+ sp->f = sp[0].f == sp[1].f;
}
break;
case OP_GE:
if (sp[1].f == SYSMIS)
sp->f = SYSMIS;
else
- sp->f = approx_ge (sp[0].f, sp[1].f);
+ sp->f = sp[0].f >= sp[1].f;
}
break;
case OP_GT:
if (sp[1].f == SYSMIS)
sp->f = SYSMIS;
else
- sp->f = approx_gt (sp[0].f, sp[1].f);
+ sp->f = sp[0].f > sp[1].f;
}
break;
case OP_LE:
if (sp[1].f == SYSMIS)
sp->f = SYSMIS;
else
- sp->f = approx_le (sp[0].f, sp[1].f);
+ sp->f = sp[0].f <= sp[1].f;
}
break;
case OP_LT:
if (sp[1].f == SYSMIS)
sp->f = SYSMIS;
else
- sp->f = approx_lt (sp[0].f, sp[1].f);
+ sp->f = sp[0].f < sp[1].f;
}
break;
case OP_NE:
if (sp[1].f == SYSMIS)
sp->f = SYSMIS;
else
- sp->f = approx_ne (sp[0].f, sp[1].f);
+ sp->f = sp[0].f != sp[1].f;
}
break;
if (sp->f == SYSMIS)
break;
for (i = 1; i <= n_args; i++)
- if (approx_eq (sp[0].f, sp[i].f))
+ if (sp[0].f == sp[i].f)
{
sp->f = 1.0;
goto main_loop;
for (i = 1; i <= n_args; i += 2)
if (sp[i].f == SYSMIS || sp[i + 1].f == SYSMIS)
continue;
- else if (approx_ge (sp[0].f, sp[i].f)
- && approx_le (sp[0].f, sp[i + 1].f))
+ else if (sp[0].f >= sp[i].f && sp[0].f <= sp[i + 1].f)
{
sp->f = 1.0;
goto main_loop;
sp->f *= sp->f;
break;
case OP_NUM_TO_BOOL:
- if (approx_eq (sp->f, 0.0))
+ if (sp->f == 0.0)
sp->f = 0.0;
- else if (approx_eq (sp->f, 1.0))
+ else if (sp->f == 1.0)
sp->f = 1.0;
else if (sp->f != SYSMIS)
{
{
if (sp[1].f == SYSMIS)
{
- if (approx_ne (sp[0].f, 0.0))
+ if (sp[0].f != 0.0)
sp->f = SYSMIS;
}
else
break;
case OP_CASENUM:
sp++;
- sp->f = vfm_sink_info.ncases + 1;
+ sp->f = case_num;
break;
case OP_SENTINEL: