mirror of https://github.com/python/cpython
Fix-up signature for approximation.
This commit is contained in:
parent
7ea82253ea
commit
9c6d81f5dd
|
@ -195,16 +195,17 @@ class Rational(RationalAbc):
|
||||||
n, d = d, n
|
n, d = d, n
|
||||||
return cf
|
return cf
|
||||||
|
|
||||||
@classmethod
|
def approximate(self, max_denominator):
|
||||||
def approximate_from_float(cls, f, max_denominator):
|
'Best rational approximation with a denominator <= max_denominator'
|
||||||
'Best rational approximation to f with a denominator <= max_denominator'
|
|
||||||
# XXX First cut at algorithm
|
# XXX First cut at algorithm
|
||||||
# Still needs rounding rules as specified at
|
# Still needs rounding rules as specified at
|
||||||
# http://en.wikipedia.org/wiki/Continued_fraction
|
# http://en.wikipedia.org/wiki/Continued_fraction
|
||||||
cf = cls.from_float(f).as_continued_fraction()
|
if self.denominator <= max_denominator:
|
||||||
|
return self
|
||||||
|
cf = self.as_continued_fraction()
|
||||||
result = Rational(0)
|
result = Rational(0)
|
||||||
for i in range(1, len(cf)):
|
for i in range(1, len(cf)):
|
||||||
new = cls.from_continued_fraction(cf[:i])
|
new = self.from_continued_fraction(cf[:i])
|
||||||
if new.denominator > max_denominator:
|
if new.denominator > max_denominator:
|
||||||
break
|
break
|
||||||
result = new
|
result = new
|
||||||
|
|
|
@ -155,10 +155,10 @@ class RationalTest(unittest.TestCase):
|
||||||
[-4, 1, 6, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1, 14, 3, 3])
|
[-4, 1, 6, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1, 14, 3, 3])
|
||||||
self.assertEqual(R(0).as_continued_fraction(), [0])
|
self.assertEqual(R(0).as_continued_fraction(), [0])
|
||||||
|
|
||||||
def testApproximateFromFloat(self):
|
def testApproximateFrom(self):
|
||||||
self.assertEqual(R.approximate_from_float(math.pi, 10000), R(355, 113))
|
self.assertEqual(R.from_float(math.pi).approximate(10000), R(355, 113))
|
||||||
self.assertEqual(R.approximate_from_float(-math.pi, 10000), R(-355, 113))
|
self.assertEqual(R.from_float(-math.pi).approximate(10000), R(-355, 113))
|
||||||
self.assertEqual(R.approximate_from_float(0.0, 10000), R(0))
|
self.assertEqual(R.from_float(0.0).approximate(10000), R(0))
|
||||||
|
|
||||||
def testConversions(self):
|
def testConversions(self):
|
||||||
self.assertTypedEquals(-1, trunc(R(-11, 10)))
|
self.assertTypedEquals(-1, trunc(R(-11, 10)))
|
||||||
|
|
Loading…
Reference in New Issue