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() { | 	for v, err = it.Next(); err == nil; v, err = it.Next() { | ||||||
| 		if subIter, ok := v.(Iterator); ok { | 		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 | 				break | ||||||
| 			} | 			} | ||||||
| 			if subIter.HasOperation(cleanName) { | 			if subIter.HasOperation(cleanName) { | ||||||
|  | |||||||
| @ -36,6 +36,10 @@ func evalContextValue(ctx ExprContext, self *term) (v any, err error) { | |||||||
| 		for _, key := range keys { | 		for _, key := range keys { | ||||||
| 			d[key], _ = sourceCtx.GetVar(key) | 			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 | 		v = d | ||||||
| 	} else { | 	} else { | ||||||
| 		err = self.errIncompatibleType(childValue) | 		err = self.errIncompatibleType(childValue) | ||||||
|  | |||||||
| @ -16,10 +16,11 @@ type fraction struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func newFraction(num, den int64) *fraction { | func newFraction(num, den int64) *fraction { | ||||||
| 	if den < 0 { | 	/*	if den < 0 { | ||||||
| 		den = -den | 		den = -den | ||||||
| 		num = -num | 		num = -num | ||||||
| 	} | 	}*/ | ||||||
|  | 	num, den = simplifyIntegers(num, den) | ||||||
| 	return &fraction{num, den} | 	return &fraction{num, den} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -145,12 +146,12 @@ func lcm(a, b int64) (l int64) { | |||||||
| 
 | 
 | ||||||
| func sumFract(f1, f2 *fraction) (sum *fraction) { | func sumFract(f1, f2 *fraction) (sum *fraction) { | ||||||
| 	m := lcm(f1.den, f2.den) | 	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 | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func mulFract(f1, f2 *fraction) (prod *fraction) { | 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 | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -239,23 +240,30 @@ func divAnyFract(af1, af2 any) (quot any, err error) { | |||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func simplifyFraction(f *fraction) any { | func simplifyFraction(f *fraction) (v any) { | ||||||
| 	return simplifyIntegers(f.num, f.den) | 	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 { | 	if den < 0 { | ||||||
| 		den = -den | 		den = -den | ||||||
| 		num = -num | 		num = -num | ||||||
| 	} | 	} | ||||||
| 	g := gcd(num, den) | 	g := gcd(num, den) | ||||||
| 	num = num / g | 	a = num / g | ||||||
| 	den = den / g | 	b = den / g | ||||||
| 	if den == 1 { |  | ||||||
| 		v = num |  | ||||||
| 	} else { |  | ||||||
| 		v = &fraction{num, den} |  | ||||||
| 	} |  | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user