Compare commits
	
		
			3 Commits
		
	
	
		
			5809de419f
			...
			2c55167dd0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2c55167dd0 | |||
| c124e880c4 | |||
| 4db015e4b1 | 
| @ -100,7 +100,7 @@ func doMul(ctx ExprContext, name string, it Iterator) (result any, err error) { | ||||
| 
 | ||||
| 	for v, err = it.Next(); err == nil; v, err = it.Next() { | ||||
| 		if subIter, ok := v.(Iterator); ok { | ||||
| 			if v, err = doAdd(ctx, name, subIter); err != nil { | ||||
| 			if v, err = doMul(ctx, name, subIter); err != nil { | ||||
| 				break | ||||
| 			} | ||||
| 			if subIter.HasOperation(cleanName) { | ||||
|  | ||||
| @ -36,6 +36,10 @@ func evalContextValue(ctx ExprContext, self *term) (v any, err error) { | ||||
| 		for _, key := range keys { | ||||
| 			d[key], _ = sourceCtx.GetVar(key) | ||||
| 		} | ||||
| 		keys = sourceCtx.EnumFuncs(func(name string) bool { return true }) | ||||
| 		for _, key := range keys { | ||||
| 			d[key], _ =sourceCtx.GetFuncInfo(key) | ||||
| 		} | ||||
| 		v = d | ||||
| 	} else { | ||||
| 		err = self.errIncompatibleType(childValue) | ||||
|  | ||||
| @ -16,10 +16,11 @@ type fraction struct { | ||||
| } | ||||
| 
 | ||||
| func newFraction(num, den int64) *fraction { | ||||
| 	if den < 0 { | ||||
| 	/*	if den < 0 { | ||||
| 		den = -den | ||||
| 		num = -num | ||||
| 	} | ||||
| 	}*/ | ||||
| 	num, den = simplifyIntegers(num, den) | ||||
| 	return &fraction{num, den} | ||||
| } | ||||
| 
 | ||||
| @ -145,12 +146,12 @@ func lcm(a, b int64) (l int64) { | ||||
| 
 | ||||
| func sumFract(f1, f2 *fraction) (sum *fraction) { | ||||
| 	m := lcm(f1.den, f2.den) | ||||
| 	sum = &fraction{f1.num*(m/f1.den) + f2.num*(m/f2.den), m} | ||||
| 	sum = newFraction(f1.num*(m/f1.den) + f2.num*(m/f2.den), m) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func mulFract(f1, f2 *fraction) (prod *fraction) { | ||||
| 	prod = &fraction{f1.num * f2.num, f1.den * f2.den} | ||||
| 	prod = newFraction(f1.num * f2.num, f1.den * f2.den) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| @ -239,23 +240,30 @@ func divAnyFract(af1, af2 any) (quot any, err error) { | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func simplifyFraction(f *fraction) any { | ||||
| 	return simplifyIntegers(f.num, f.den) | ||||
| func simplifyFraction(f *fraction) (v any) { | ||||
| 	f.num, f.den = simplifyIntegers(f.num, f.den) | ||||
| 	if f.den == 1 { | ||||
| 		v = f.num | ||||
| 	} else { | ||||
| 		v = &fraction{f.num, f.den} | ||||
| 	} | ||||
| 	return v | ||||
| } | ||||
| 
 | ||||
| func simplifyIntegers(num, den int64) (v any) { | ||||
| func simplifyIntegers(num, den int64) (a, b int64) { | ||||
| 	if num == 0 { | ||||
| 		return 0, 1 | ||||
| 	} | ||||
| 	if den == 0 { | ||||
| 		panic("fraction with denominator == 0") | ||||
| 	} | ||||
| 	if den < 0 { | ||||
| 		den = -den | ||||
| 		num = -num | ||||
| 	} | ||||
| 	g := gcd(num, den) | ||||
| 	num = num / g | ||||
| 	den = den / g | ||||
| 	if den == 1 { | ||||
| 		v = num | ||||
| 	} else { | ||||
| 		v = &fraction{num, den} | ||||
| 	} | ||||
| 	a = num / g | ||||
| 	b = den / g | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user