コード例 #1
0
ファイル: num.c プロジェクト: ashvtol/asccalc
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;
}
コード例 #2
0
ファイル: num.c プロジェクト: ashvtol/asccalc
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;
}
コード例 #3
0
ファイル: num.c プロジェクト: ashvtol/asccalc
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;
}
コード例 #4
0
ファイル: Zahlenraten.c プロジェクト: atextor/naturel
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;