Нули сразу после запятой
Разберёмся с другим случаем: когда дробь меньше 1 и у неё есть нули сразу после запятой. Пусть x — число от 0 до 1, а h — позиция, на которой стоит его первая ненулевая цифра. Тогда
b−h ≤ x < b−(h−1),
то есть перед первой значащей цифрой стоит ровно h − 1 нулей.
Пример: вычислим четвёртую степень числа 0,38:
(0,38)4 = 81/84 = 0,01218,
здесь начальный ноль ровно один.
Число начальных нулей можно найти иначе: вычесть из kN количество цифр целого числа MN. Удобна и формула через логарифм:
начальных нулей = ⌈−N·logbx⌉ − 1.
Но если x стоит рядом с точной степенью основания, надёжнее прямое сравнение степеней: округление логарифма может пересечь границу и испортить ответ.
Модуль Fraction
Тип Fraction хранит число как точную обыкновенную дробь и не округляет. Для числа вроде (0,716)13 с огромными степенями это даёт безошибочный ответ, тогда как логарифм с плавающей точкой может промахнуться на единицу, если число близко к границе.
Пример:
from fractions import Fraction
x = Fraction(7**13, 16**13) # точное значение
n = 0
while x < Fraction(1, 16**(n+1)): n += 1 # ищем нули после запятой
print(n)
Проверь себя