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); } } }
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 (); } }
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; }
static int e_mpf_ulong_p (mpf_srcptr f) { return mpf_integer_p (f) && mpf_fits_ulong_p (f); }
//------------------------------------------------------------------------------ // Name: //------------------------------------------------------------------------------ bool knumber_float::is_integer() const { return mpf_integer_p(mpf_) != 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; }