X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fexpr-evl.c;h=62a9f6b2eae6b9768c6d990111f829fb7ff40932;hb=2ca4a5735ccbbe66ae2277faf6aa47e2bb83bfab;hp=3a6abca6eba41af508b1080a37c39bb05991c135;hpb=6f972e0ef93c3a7e00fd5335ea22af2c878f4589;p=pspp diff --git a/src/expr-evl.c b/src/expr-evl.c index 3a6abca6eb..62a9f6b2ea 100644 --- a/src/expr-evl.c +++ b/src/expr-evl.c @@ -37,11 +37,11 @@ #include #include #include -#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" @@ -51,7 +51,8 @@ #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; @@ -102,7 +103,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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) @@ -113,16 +114,14 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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): @@ -193,7 +192,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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: @@ -203,7 +202,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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: @@ -213,7 +212,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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: @@ -223,7 +222,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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: @@ -233,7 +232,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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: @@ -243,7 +242,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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; @@ -396,7 +395,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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; @@ -537,8 +536,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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; @@ -1109,9 +1107,9 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) 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) { @@ -1130,7 +1128,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) { if (sp[1].f == SYSMIS) { - if (approx_ne (sp[0].f, 0.0)) + if (sp[0].f != 0.0) sp->f = SYSMIS; } else @@ -1278,7 +1276,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v) break; case OP_CASENUM: sp++; - sp->f = vfm_sink_info.ncases + 1; + sp->f = case_num; break; case OP_SENTINEL: