num_t num_new_z(int flags, num_t b) { num_t r; r = num_new(flags); r->num_type = NUM_INT; mpz_init(Z(r)); if (b != NULL) { if (b->num_type == NUM_INT) mpz_set(Z(r), Z(b)); else if (b->num_type == NUM_FP) mpfr_get_z(Z(r), F(b), round_mode); } return r; }
num_t num_new_fp(int flags, num_t b) { num_t r; r = num_new(flags); r->num_type = NUM_FP; mpfr_init(F(r)); if (b != NULL) { mpfr_prec_t prec_b = num_prec(b); if (prec_b > mpfr_get_default_prec()) mpfr_set_prec(F(r), prec_b); if (b->num_type == NUM_INT) mpfr_set_z(F(r), Z(b), round_mode); else if (b->num_type == NUM_FP) mpfr_set(F(r), F(b), round_mode); } return r; }
num_t num_new_from_str(int flags, numtype_t typehint, char *str) { numtype_t type = typehint; double exp; char *suffix, *s; int base, type_override, r; num_t n; n = num_new(flags); /* * If it's a decimal number but it doesn't have a floating point, suffix, etc * treat it as an integer. */ type_override = 1; if (typehint == NUM_FP) { s = (str[1] == 'd') ? str + 2 : str; while (*s != '\0') { if (!isdigit(*s++)) { type_override = 0; break; } } if (type_override) type = NUM_INT; } n->num_type = type; base = 0; if (str[1] == 'd') { base = 10; str += 2; } if (type == NUM_INT) { if ((r = mpz_init_set_str(Z(n), str, base)) != 0) { yyxerror("mpz_init_set_str"); mpz_clear(Z(n)); } } else { if (str[1] == 'd') str += 2; mpfr_init(F(n)); r = mpfr_strtofr(F(n), str, &suffix, 0, round_mode); /* * XXX: add support for IEC binary prefixes? */ if (*suffix != '\0') { switch (*suffix) { case 'k': exp = 1000; break; case 'M': exp = 1000000; break; case 'G': exp = 1000000000; break; case 'T': exp = 1000000000000; break; case 'P': exp = 1000000000000000; break; case 'E': exp = 1000000000000000000; break; case 'm': exp = 0.001; break; case 'u': exp = 0.000001; break; case 'n': exp = 0.000000001; break; case 'p': exp = 0.000000000001; break; case 'f': exp = 0.000000000000001; break; case 'a': exp = 0.000000000000000001; break; default: yyxerror("Unknown suffix"); exit(1); } mpfr_mul_d(F(n), F(n), exp, round_mode); } } return n; }
Zufallsgenerator createZufallsgenerator() { Zufallsgenerator obj = ((Zufallsgenerator)getmem(sizeof(struct SZufallsgenerator))); return obj; } Zufallsgenerator Zufallsgenerator_new() { Zufallsgenerator this = createZufallsgenerator(); initZufallsgenerator(this); return this; } void initZufallsgenerator(Zufallsgenerator this) { initObject((Object)this); ((Zufallsgenerator)this)->getRand = Zufallsgenerator_getRand; ((Zufallsgenerator)this)->varClass_4 = num_new(0); ((Zufallsgenerator)this)->varClass_3 = num_new(524288); ((Zufallsgenerator)this)->varClass_2 = num_new(17); ((Zufallsgenerator)this)->varClass_1 = num_new(137153); } num Zufallsgenerator_getRand(Zufallsgenerator this) { num varLocal_13; num varLocal_14; num varLocal_15; num varLocal_16; num varLocal_17; num varLocal_18; num varLocal_19; num varLocal_20;