operator-fraction.go: the constructor newFraction() does call simplifyIntegers() on the num e den

This commit is contained in:
Celestino Amoroso 2024-05-02 11:04:20 +02:00
parent c124e880c4
commit 2c55167dd0

View File

@ -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
} }