示例#1
0
文件: real.c 项目: getreu/grpn
/* trig func */
Real * asinReal(Real *a){
   Real *p = newReal();
   p->ok = a->ok;
   p->num = asin(a->num);
   checkFinite(p);
   return p;
}
示例#2
0
文件: real.c 项目: getreu/grpn
/* trig func */
Real * acosReal(Real *a){
   Real *p = newReal();
   p->ok = a->ok;
   p->num = acos(a->num);
   checkFinite(p);
   return p;
}
示例#3
0
文件: real.c 项目: getreu/grpn
/* 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;
}
示例#4
0
文件: real.c 项目: getreu/grpn
/* 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;
}
示例#5
0
文件: real.c 项目: getreu/grpn
/* negate a Real number */
Real * negReal(Real *a){
   Real *p = newReal();
   p->ok = a->ok;
   p->num = -(a->num);
   checkFinite(p);
   return p;
}
示例#6
0
文件: real.c 项目: getreu/grpn
/* 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;
}
示例#7
0
文件: real.c 项目: getreu/grpn
/* 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);
	 }
示例#8
0
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));
}
示例#9
0
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);
}
示例#10
0
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);
}
示例#11
0
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);
}
示例#12
0
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));
}
示例#13
0
文件: real.c 项目: getreu/grpn
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;
}
示例#14
0
文件: real.c 项目: getreu/grpn
/* 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;
}
示例#15
0
文件: real.c 项目: getreu/grpn
/* 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;
}
示例#16
0
文件: real.c 项目: getreu/grpn
/* 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;
}
示例#17
0
文件: real.c 项目: getreu/grpn
/* 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;
}
示例#18
0
文件: real.c 项目: getreu/grpn
/* 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;
}
示例#19
0
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;
	}
}