示例#1
0
/* Arithmetic */
SCValue* Fraction_add(SCFraction* self, SCValue* other) {
    SCValue* ret;
    switch (other->type) {
        case kValueFraction:
        {
            SCNumber numerator = self->numerator * other->fraction->denominator + self->denominator * other->fraction->numerator;
            SCNumber denominator = self->denominator * other->fraction->denominator;
            ret = ValFrac(Fraction_new(numerator, denominator));
            break;
        }
        case kValueInteger:
        {
            SCNumber numerator = self->numerator + other->integer * self->denominator;
            SCNumber denominator = self->denominator;
            ret = ValFrac(Fraction_new(numerator, denominator));
            break;
        }
        case kValueReal:
        {
            ret = ValReal(Fraction_asReal(self) + other->real);
            break;
        }
        default:
            return ValErr(nonArithType(other->type));
            break;
    }
    return ret;
}
示例#2
0
double Value_asReal(const Value* val) {
	double ret;
	
	switch(val->type) {
		case VAL_INT:
			ret = val->ival;
			break;
		
		case VAL_REAL:
			ret = val->rval;
			break;
		
		case VAL_FRAC:
			ret = Fraction_asReal(val->frac);
			break;
		
		default:
			/* Expression couldn't be evaluated, so it's not a number */
			ret = NAN;
			break;
	}
	
	return ret;
}