示例#1
0
文件: mpd.c 项目: gap-packages/float
static Obj MPD_STRING(Obj self, Obj s, Obj prec)
{
  while (!IsStringConv(s))
    {
      s = ErrorReturnObj("MPD_STRING: object to be converted must be a string, not a %s",
			 (Int)TNAM_OBJ(s),0,
			 "You can return a string to continue" );
    }
  TEST_IS_INTOBJ("MPD_STRING",prec);
  int n = INT_INTOBJ(prec);
  if (n == 0)
    n = GET_LEN_STRING(s)*1000 / 301;

  Obj g = NEW_MPD(INT_INTOBJ(prec));
  char *p = (char *) CHARS_STRING(s), *newp;
  int sign = 1;
  mpd_set_ui(MPD_OBJ(g), 0, MPD_RNDNN);
  mpfr_ptr f = MPD_OBJ(g)->re;
  Obj newg = NEW_MPFR(INT_INTOBJ(prec));

  for (;;) {
    printf("<%c>",*p);
    switch (*p) {
    case '-':
    case '+':
    case 0:
      if (!mpfr_nan_p(MPFR_OBJ(newg))) { /* drop the last read float */
	mpfr_add (f, f, MPFR_OBJ(newg), GMP_RNDN);
	mpfr_set_nan (MPFR_OBJ(newg));
	f = MPD_OBJ(g)->re;
	sign = 1;
      }
      if (!*p)
	return g;
      if (*p == '-')
	sign = -sign;
    case '*': p++; break;
    case 'i':
    case 'I': if (f == GET_MPD(g)->re) {
	f = MPD_OBJ(g)->im;
	if (mpfr_nan_p(MPFR_OBJ(newg)))
	  mpfr_set_si (MPFR_OBJ(newg), sign, GMP_RNDN); /* accept 'i' as '1*i' */
      } else return Fail;
      p++; break;
    default:
      mpfr_strtofr(MPFR_OBJ(newg), p, &newp, 10, GMP_RNDN);
      if (newp == p && f != GET_MPD(g)->im)
	return Fail; /* no valid characters read */
      if (sign == -1)
	mpfr_neg(MPFR_OBJ(newg), MPFR_OBJ(newg), GMP_RNDN);
      p = newp;
    }
  }
  return g;
}
示例#2
0
文件: macfloat.c 项目: hulpke/gap
Obj FuncMACFLOAT_STRING( Obj self, Obj s )
{

    while (!IsStringConv(s))
    {
        s = ErrorReturnObj("MACFLOAT_STRING: object to be converted must be a string not a %s",
                           (Int)(InfoBags[TNUM_OBJ(s)].name),0,"You can return a string to continue" );
    }
    char * endptr;
    UChar *sp = CHARS_STRING(s);
    Obj res= NEW_MACFLOAT((Double) STRTOD((char *)sp,&endptr));
    if ((UChar *)endptr != sp + GET_LEN_STRING(s))
        return Fail;
    return res;
}
示例#3
0
 std::string operator()(Obj recval) const
 {
     if(!isa(recval))
         throw GAPException("Invalid attempt to read string");
     return std::string((char*)CHARS_STRING(recval));
 }