Exemplo n.º 1
0
vanilla::object::ptr vanilla::int_object::neq(object::ptr const& other)
{
    switch(other->type_id())
    {
        case OBJECT_ID_INT:
        {
            int_object const* rhs = static_cast<int_object const*>(other.get());
            int result = mpz_cmp(_v.mpz(), rhs->value().mpz());
            return allocate_object<bool_object>(result != 0);
        }
        
        case OBJECT_ID_FLOAT:
        {
            float_object const* rhs = static_cast<float_object const*>(other.get());
            if(!mpf_integer_p(rhs->value().mpf()))
                return allocate_object<bool_object>(true);
            
            float_object::float_type lhs( (_v.mpz()) );
            return allocate_object<bool_object>(mpf_cmp(lhs.mpf(), rhs->value().mpf()) != 0);
        }
        
        default:
        {
            return object::ge(other);
        }
    }
}
Exemplo n.º 2
0
void
one (mpf_srcptr f, int want)
{
  int  got;
  got = mpf_integer_p (f);
  if (got != want)
    {
      printf ("mpf_integer_p got %d want %d\n", got, want);
      mpf_trace (" f", f);
      abort ();
    }
}
Exemplo n.º 3
0
static int
lso_is_integer(struct ls_object *number)
{
  int type = lso_number_type_re(number);

  if (!lso_is_real(number) || type == 2)
    return 0;

  if (type == 3)
    return mpf_integer_p(*(mpf_t *)number->u2.ptr);

  return 1;
}
Exemplo n.º 4
0
static int
e_mpf_ulong_p (mpf_srcptr f)
{
  return mpf_integer_p (f) && mpf_fits_ulong_p (f);
}
Exemplo n.º 5
0
//------------------------------------------------------------------------------
// Name:
//------------------------------------------------------------------------------
bool knumber_float::is_integer() const {

	return mpf_integer_p(mpf_) != 0;
}
Exemplo n.º 6
0
char *_ntos(const struct ls_object *number, int radix)
{
  int is_complex, type_re, type_im;
  char fmt[20];
  char *str;
  int len, n;
  void *arg1 = NULL, *arg2 = NULL;

  fmt[0] = '\0';

  /* TODO: radix other than 10 */
  UNUSED_ARGUMENT(radix);

  is_complex = lso_is_complex(number);
  type_re = lso_number_type_re(number);
  type_im = lso_number_type_im(number);

  switch(type_re) {
  case 0:
    if (is_complex && number->u1.val == 0) {
      arg1 = &n;     /* simply placeholder */
      strcpy(fmt, "%n");
    } else {
      arg1 = (void *)((long) number->u1.val);
      strcpy(fmt, "%d");
    }
    break;
  case 1:
    arg1 = *((mpz_t *)number->u1.ptr);
    strcpy(fmt, "%Zd");
    break;
  case 2:
    arg1 = *((mpq_t *)number->u1.ptr);
   strcpy(fmt, "%Qd");
    break;
  case 3:
    arg1 = *((mpf_t *)number->u1.ptr);
    /* we have to use different styles for integers and non-integers */
    if (mpf_integer_p(*((mpf_t *)number->u1.ptr)))
      strcpy(fmt, "%#.1Ff");
    else
      strcpy(fmt, "%.16Fg");
    break;
  }

  if (is_complex) {
    switch(type_im) {
    case 0:
      arg2 = (void *)((long) number->u2.val);
      if (number->u2.val == 1) {
        arg2 = &n;
        strcat(fmt, "+%ni");
      } else if (number->u2.val == -1) {
        arg2 = &n;
        strcat(fmt, "-%ni");
      } else
        strcat(fmt, "%+di");
      break;
    case 1:
      arg2 = *((mpz_t *)number->u2.ptr);
      strcat(fmt, "%+Zdi");
      break;
    case 2:
      arg2 = *((mpq_t *)number->u2.ptr);
      strcat(fmt, "%+Qdi");
      break;
    case 3:
      arg2 = *((mpf_t *)number->u2.ptr);
    if (mpf_integer_p(*((mpf_t *)number->u2.ptr)))
      strcat(fmt, "%#+.1Ffi");
    else
      strcat(fmt, "%+.16Fgi");
      break;
    }
  }

  len = gmp_snprintf(NULL, 0, fmt, arg1, arg2);

  str = (char *) ls_malloc(len + 1);
  gmp_snprintf(str, len + 1, fmt, arg1, arg2);

  return str;
}