/* trig func */ Real * asinReal(Real *a){ Real *p = newReal(); p->ok = a->ok; p->num = asin(a->num); checkFinite(p); return p; }
/* trig func */ Real * acosReal(Real *a){ Real *p = newReal(); p->ok = a->ok; p->num = acos(a->num); checkFinite(p); return p; }
/* e to a Real number */ Real * expReal(Real *a){ Real *p = newReal(); p->ok = a->ok; p->num = exp(a->num); checkFinite(p); return p; }
/* log base ten of a Real number */ Real * logReal(Real *a){ Real *p = newReal(); switch(a->ok){ case REAL_OK: if(a->num > 0.0){ p->ok = a->ok; p->num = log10(a->num); checkFinite(p); } else if(a->num == 0.0){ p->ok = REAL_INF; p->num = 0.0; } else { printf("logReal(<0)\n"); exit(0); } break; case REAL_INF: p->ok = REAL_INF; p->num = 0.0; break; case REAL_NAN: p->ok = REAL_NAN; p->num = 0.0; break; default: fprintf(stderr, "logReal unknown real type\n"); exit(0); break; } return p; }
/* negate a Real number */ Real * negReal(Real *a){ Real *p = newReal(); p->ok = a->ok; p->num = -(a->num); checkFinite(p); return p; }
/* Real number to the power */ Real * powRealInt(Real *a, int b){ Real *p = newReal(); p->ok = a->ok; p->num = pow(a->num, (double)b); checkFinite(p); return p; }
/* right shift 2 Real Numbers */ Real * rshiftReal(Real *a, Real *b){ Real *p = newReal(); if(a->ok == REAL_OK && b->ok == REAL_OK){ p->ok = REAL_OK; p->num = (ulong)a->num >> (ulong)b->num; checkFinite(p); }
TVP vdmPower(TVP a,TVP b) { ASSERT_CHECK_NUMERIC(a); ASSERT_CHECK_NUMERIC(b); double av = toDouble(a); double bv = toDouble(b); return newReal(pow(av,bv)); }
TVP vdmProduct(TVP a,TVP b) { ASSERT_CHECK_NUMERIC(a); ASSERT_CHECK_NUMERIC(b); double av = toDouble(a); double bv=toDouble(b); return newReal(av*bv); }
TVP vdmDivision(TVP a,TVP b) { ASSERT_CHECK_NUMERIC(a); ASSERT_CHECK_NUMERIC(b); double av = toDouble(a); double bv = toDouble(b); return newReal(av/bv); }
TVP vdmDifference(TVP a,TVP b) { ASSERT_CHECK_NUMERIC(a); ASSERT_CHECK_NUMERIC(b); double av = toDouble(a); double bv=toDouble(b); return newReal(av-bv); }
TVP vdmMod(TVP a,TVP b) { ASSERT_CHECK_NUMERIC(a); ASSERT_CHECK_NUMERIC(b); //See https://github.com/overturetool/overture/blob/development/core/interpreter/src/main/java/org/overture/interpreter/eval/BinaryExpressionEvaluator.java#L575 ASSERT_CHECK_INT(a); ASSERT_CHECK_INT(b); double lv =(int) toDouble(a); double rv = (int)toDouble(b); return newReal(lv-rv*(long) floor(lv/rv)); }
Real * fromRadixReal(Real *a){ Real *r1; /* deal with degrees if we need to */ if(getRadixMode() == DEGREES){ r1 = divReal(a, real180Pi); } else { r1 = setRealReal(newReal(), a); } checkFinite(r1); return r1; }
/* left shift 2 Real Numbers */ Real * lshiftReal(Real *a, Real *b){ Real *p = newReal(); if(a->ok == REAL_OK && b->ok == REAL_OK){ p->ok = REAL_OK; p->num = (ulong)a->num << (ulong)b->num; checkFinite(p); } else if(a->ok == REAL_NAN || b->ok == REAL_NAN) p->ok = REAL_NAN; else p->ok = REAL_INF; return p; }
/* subtract 2 Real numbers */ Real * subReal(Real *a, Real *b){ Real *p = newReal(); if(a->ok == REAL_OK && b->ok == REAL_OK){ p->ok = REAL_OK; p->num = a->num - b->num; checkFinite(p); } else if(a->ok == REAL_NAN || b->ok == REAL_NAN) p->ok = REAL_NAN; else p->ok = REAL_INF; return p; }
/* invert a Real number */ Real * invReal(Real *a){ Real *p = newReal(); p->ok = a->ok; if(a->num == 0.0){ p->ok = REAL_NAN; p->num = 0.0; } else { p->num = 1.0 / a->num; checkFinite(p); } return p; }
/* trig func */ Real * atan2Real(Real *a, Real *b){ Real *p = newReal(); if(a->ok == REAL_OK && b->ok == REAL_OK){ p->ok = REAL_OK; p->num = atan2(a->num, b->num); checkFinite(p); } else if(a->ok == REAL_NAN || b->ok == REAL_NAN){ p->ok = REAL_NAN; p->num = 0.0; } else { p->ok = REAL_INF; p->num = 0.0; } return p; }
/* modulo 2 Real numbers */ Real * modReal(Real *a, Real *b){ Real *p = newReal(); switch(a->ok){ case REAL_OK: switch(b->ok){ case REAL_OK: if(b->num == 0.0){ p->ok = REAL_NAN; p->num = 0.0; } else { p->ok = REAL_OK; p->num = fmod(a->num , b->num); checkFinite(p); } break; case REAL_INF: p->ok = REAL_NAN; p->num = 0.0; break; case REAL_NAN: p->ok = REAL_NAN; p->num = 0.0; break; default: fprintf(stderr, "modReal unknown real type\n"); exit(0); break; } break; case REAL_INF: p->ok = REAL_INF; p->num = 0.0; break; case REAL_NAN: p->ok = REAL_NAN; p->num = 0.0; break; default: fprintf(stderr, "modReal unknown real type\n"); exit(0); break; } return p; }
TVP vdmAbs(TVP arg) { ASSERT_CHECK_NUMERIC(arg); switch(arg->type) { case VDM_INT: case VDM_NAT: case VDM_NAT1: return newInt(abs(arg->value.intVal)); case VDM_REAL: return newReal(fabs(arg->value.doubleVal)); default: FATAL_ERROR("Invalid type"); return NULL; } }