Статья Автор: Деникина Н.В., Деникин А.В.

Степень дроби: длина, нули и значащий хвост

Посмотрим, что происходит с записью при возведении дроби в степень. Пусть

x = M/bk,   0 < M < bk.

Тогда

xN = MN / bkN.

Это гарантирует точную запись в поле из kN позиций. Однако кратчайшая запись может оказаться короче — всё зависит от того, на какую степень b делится MN.

Пример: ноль справа можно удалить

Вычислим четвёртую степень числа 0,68:

(0,68)4 = 64 / 84 = 1296 / 4096 = 0,24208 = 0,2428.

Поле содержит 4 позиции, а кратчайшая запись — всего 3. Лишний ноль возник потому, что 64 делится на 8, но не на 82: один множитель основания ушёл в целую часть, а значащие цифры это не затронуло.

Проверь себя

Сколько цифр стоит после запятой в восьмеричной записи числа (0,538)10?


Число (0, C16)4 записали в поле из четырёх шестнадцатеричных позиций. Сколько позиций останется после удаления всех нулей в конце? Ответ — целое число.


Сколько нулей в конце записи

Теперь научимся заранее предсказывать, сколько нулей появится в конце записи. Обозначим через vp(M) число множителей простого p в разложении числителя M, где p — простой множитель в разложении основания системы счисления.

Пусть основание раскладывается как

b = ∏ piei

Тогда число нулей в конце записи равно

z = min ⌊ (N · vpi(M)) / ei ⌋

а длина кратчайшей записи —

\(l = kN − z\)

Почему берётся минимум? Чтобы в конце записи появился ноль, в числителе должен накопиться "полный набор" всех простых множителей основания. Если в основании есть и 2, и 5 (как в десятичной системе), то нули будут появляться только до тех пор, пока не закончится самый дефицитный множитель. Именно он и ограничивает количество нулей.

Пример: Если у нас в числителе много двоек, но всего одна пятерка, мы сможем получить только один ноль, так как "дефицитная" пятерка не даст собрать больше комбинаций "2 · 5".

 

Частный случай: основание — степень двойки

Для b = 2e и M = 2a · q, где q нечётно, формула упрощается: z = ⌊ aN / e ⌋. После удаления z нулей в числителе остаётся

2(aN − ez) · qN

Остаточная степень двойки определяет последнюю ненулевую цифру.
Пример:
Найти последнюю ненулевую цифру числа (0,A816)7 .

В числители168 = 23 · 21, отсюда z = 5, а остаточная степень равна 21. Поэтому последняя цифра находится по остатку 21 · 217 по модулю 16 и равна A.

Проверь себя

Какая последняя ненулевая цифра у шестнадцатеричной записи числа (0,A416)10?


Нули сразу после запятой

Разберёмся с другим случаем: когда дробь меньше 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)
Проверь себя

Сколько нулей стоит сразу после запятой в шестнадцатеричной записи числа (0,AB16)10? Ответ — целое число.


У числа (0,F16)N первая цифра после запятой ненулевая при малых N. При каком наименьшем N сразу после запятой появится ноль?


Определите истинность каждого утверждения.

Печать