def equal_or_lesser_assignable(self): r'''Gets assignable duration equal or just less than this duration. .. container:: example **Example.** Gets equal-or-lesser assignable duration: :: >>> for numerator in range(1, 16 + 1): ... duration = Duration(numerator, 16) ... result = duration.equal_or_lesser_assignable ... sixteenths = duration.with_denominator(16) ... print('{!s}\t{!s}'.format(sixteenths, result)) ... 1/16 1/16 2/16 1/8 3/16 3/16 4/16 1/4 5/16 1/4 6/16 3/8 7/16 7/16 8/16 1/2 9/16 1/2 10/16 1/2 11/16 1/2 12/16 3/4 13/16 3/4 14/16 7/8 15/16 15/16 16/16 1 Returns new duration. ''' good_denominator = mathtools.least_power_of_two_greater_equal( self.denominator) current_numerator = self.numerator candidate = type(self)(current_numerator, good_denominator) while not candidate.is_assignable: current_numerator -= 1 candidate = type(self)(current_numerator, good_denominator) return candidate
def equal_or_lesser_assignable(self): r'''Equal or lesser assignable: :: >>> for numerator in range(1, 16 + 1): ... duration = Duration(numerator, 16) ... result = duration.equal_or_lesser_assignable ... print '{}\t{}'.format( ... duration.with_denominator(16), result) ... 1/16 1/16 2/16 1/8 3/16 3/16 4/16 1/4 5/16 1/4 6/16 3/8 7/16 7/16 8/16 1/2 9/16 1/2 10/16 1/2 11/16 1/2 12/16 3/4 13/16 3/4 14/16 7/8 15/16 15/16 16/16 1 Returns new duration. ''' good_denominator = mathtools.least_power_of_two_greater_equal( self.denominator) current_numerator = self.numerator candidate = type(self)(current_numerator, good_denominator) while not candidate.is_assignable: current_numerator -= 1 candidate = type(self)(current_numerator, good_denominator) return candidate
def test_mathtools_least_power_of_two_greater_equal_01(): r'''Returns least integer power of two greater than or equal to n.''' assert mathtools.least_power_of_two_greater_equal(1) == 1 assert mathtools.least_power_of_two_greater_equal(2) == 2 assert mathtools.least_power_of_two_greater_equal(3) == 4 assert mathtools.least_power_of_two_greater_equal(4) == 4 assert mathtools.least_power_of_two_greater_equal(5) == 8 assert mathtools.least_power_of_two_greater_equal(6) == 8 assert mathtools.least_power_of_two_greater_equal(7) == 8 assert mathtools.least_power_of_two_greater_equal(8) == 8 assert mathtools.least_power_of_two_greater_equal(9) == 16 assert mathtools.least_power_of_two_greater_equal(10) == 16 assert mathtools.least_power_of_two_greater_equal(11) == 16 assert mathtools.least_power_of_two_greater_equal(12) == 16
def test_mathtools_least_power_of_two_greater_equal_03(): r'''Optional offset keyword allows for the next to greatest integer power of two, etc.''' assert mathtools.least_power_of_two_greater_equal(1, 1) == 2 assert mathtools.least_power_of_two_greater_equal(2, 1) == 4 assert mathtools.least_power_of_two_greater_equal(3, 1) == 8 assert mathtools.least_power_of_two_greater_equal(4, 1) == 8 assert mathtools.least_power_of_two_greater_equal(5, 1) == 16 assert mathtools.least_power_of_two_greater_equal(6, 1) == 16 assert mathtools.least_power_of_two_greater_equal(7, 1) == 16 assert mathtools.least_power_of_two_greater_equal(8, 1) == 16 assert mathtools.least_power_of_two_greater_equal(9, 1) == 32 assert mathtools.least_power_of_two_greater_equal(10, 1) == 32 assert mathtools.least_power_of_two_greater_equal(11, 1) == 32 assert mathtools.least_power_of_two_greater_equal(12, 1) == 32