Представление действительных чисел

Упражнения на запись дробных чисел в двоичной системе счисления

A: Двоичную дробь в десятичную

Дано неотрицательное число, записанное в виде двоичной дроби: запись содержит только цифры 0 и 1 и, возможно, точку. Запись числа содержит не более 30 символов. Переведите это значение в величину типа float и выведите результат.

Ввод Вывод
11.01
3.25
100
4
0.111111
0.984375

B: Десятичную дробь в двоичную

Дано действительное неотрицательное число, не превосходящее 100, записанное в десятичном виде с фиксированной точкой. Необходимо представить его в виде двоичной дроби с фиксированной точкой и вывести это представление. Ответ должен отличаться от верного не более, чем на 2-32 степени, поэтому необходимо вывести не менее 32 двоичных цифр после точки.

Ввод Вывод
3.25
11.01
4
100
0.1
0.00011001100110011001100110011001100110011

C: Двоичную периодическую дробь в десятичное число

Дана запись двоичной периодической дроби, которая включает в себя:

  1. Необязательную целую часть.
  2. Обязательный символ точки, отделяющий целую часть от дробной.
  3. Необязательную дробную непериодическую часть.
  4. Необязательную периодическую дробную часть, записываемую в круглых скобках.

Переведите значение этой дроби в величину типа float и выведите результат. Общая длина входной строки не превосходит 30 символов.

Ввод Вывод
0.(01)
0.33333333333333
11.01
3.25
10.0(101)
2.357142857143

D: Рациональную дробь в двоичную периодическую

Дано рациональное число. Запишите его в виде двоичной периодической дроби.

На вход программа получает два натуральных числа n и m, каждое из которых не превосходит 1000. Программа должна вывести значение n/m, записанное в виде двоичной периодической дроби, при этом длина непериодической дробной части и длина периода должны быть минимально возможными. Если данное число является конечной двоичной дробью, периодическую часть выводить не надо.

Формат вывода двоичной дроби соответствует предыдущей задаче.

Ввод Вывод
1 3
0.(01)
13 4
11.01
5 14
0.0(101)

E: Двоичную периодическую дробь в рациональное число

Дана запись двоичной периодической дроби. Необходимо представить ее в виде несократимой рациональной дроби n/m. Программа должна вывести значения n и m.

Ввод Вывод
0.(01)
1 3
11.01
13 4
0.0(101)
5 14

Упражнения на представление действительных чисел в стандарте IEEE-754

В следующих задачах рассмотрим вымышленный тип данных, запись которого содержит \(1+p+m\) бит, где 1 бит отводится на знак числа, \(p\) бит отводится на хранение порядка числа, \(m\) бит отводится на хранение дробной части мантиссы числа. Например, для чисел двойной точности \(p=11\) и \(m=52\).

Хранение чисел осуществляется так же, как в формате IEEE-754. А именно, порядок хранится в смещённом представлении, код порядка 0b011...11 соответствует порядку 0, в битах мантиссы хранятся биты нормализованного представления числа после точки.

Специальное значение порядка 0b11...11 не используется (зарезервировано за константами inf и nan). Специальное значение порядка 0b00...00 означает, что в этом случае в мантиссе хранятся биты ненормализованного представления.

В последующих задачах даны числа \(p\) и \(m\), при этом \(7\le p \le 11\), \(5\le m\le 52\).

F: Машинное эпсилон

Напомним, что машинным эпсилоном называется такое наименьшее положительное число \(\varepsilon\), представимое в данном типе, что \(1+\varepsilon\neq1\).

По данным числам \(p\) и \(m\) определите значение машинного эпсилон для действительного типа данных размера \(1+p+m\) бит, запишите его в переменную типа float и выведите его.

Ввод Вывод
11
52
2.220446049250313e-16

G: Наименьшее целое непредставимое число

Найдите наименьшее целое число, которое не может быть представлено в этом типе данных точно. Вычислите его в переменной типа int (в питоне же длинная целочисленная арифметика) и выведите ответ.

Ввод Вывод
11
52
9007199254740993

H: Наибольшее представимое число

Определите наибольшее число, которое может быть представлено в этом типе данных. Оно будет каким-то целым числом, поэтому его можно точно вычислить в переменной типа int и вывести.

Ответ в примере слишком большой, приведём его первые и последние цифры. Всего в ответе 309 цифр.

Ввод Вывод
11
52
1797...8368

I: Наименьшее положительное число

Определите наименьшее положительное число, которое может быть представлено в этом типе данных. Обратите внимание, что при значении порядка 0b00...000 в мантиссе хранится ненормализованное представление числа.

Запишите результат в переменную типа float и выведите его.

Ввод Вывод
11
52
5e-324

J: is_inf

В модуле math есть функция math.isinf(x), которая возвращает True, если число является положительной или отрицательной бесконечностью, и False в противном случае. Самостоятельно реализуйте аналог этой функции. Решение оформите в виде функции def is_inf(x: float) -> bool. Функция принимает аргумент, который может быть любым значением типа float, в том числе NaN.

Сдайте на проверку только тело функции. Например, аналогичная функция is_nan может выглядеть так:

def is_nan(x):
    return x != x
Вызов функции Возвращаемое значенрие
is_inf(1.0)
False

K: Двоичное представление действительного числа

Даны числа \(p\) и \(m\) (в первой строке входных данных). Во второй строке записаны \(1 + p + m\) символов 0 или 1: битовое представление действительного числа. Первый бит — знаковый, затем \(p\) бит показателя степени (от старшего к младшему), затем \(m\) бит мантиссы (от старшего к младшему). Определите значение этого числа, запишите его в переменную типа float и выведите его.

Гарантируется, что не все биты показателя степени равны 1. Также не забывайте, что если все биты показателя степени равны 0, то в мантиссе хранится денормализованное представление числа.

Ввод Вывод
11 52
0011111111110000000000000000000000000000000000000000000000000000
1.0
11 52
0011111111010101010101010101010101010101010101010101010101010101
0.3333333333333333
11 52
1000000000000000000000000000000000000000000000000000000000000001
-5e-324

Упражнения на вычисления с действительными числами с использованием \(\varepsilon\)

L: a + b == c

Даны три действительных числа: a, b, c. Проверьте, выполняется ли равенство a+b=c. Если равенство выполняется, выведите YES, если не выполняется, выведите NO.

Числа a, b, c — действительные, положительные, не превосходят 10 и заданы не более, чем с 7 знаками после точки.

Ввод Вывод
2
3
7
NO
0.1
0.2
0.3
YES

M: Утренняя пробежка - 1

Подобную задачу вы уже решали.

В первый день спортсмен пробежал x километров, а затем он каждый день увеличивал пробег на 70% от предыдущего значения. По данному числу y определите номер дня, на который пробег спортсмена составит не менее y километров.

На вход программа получает два числа x и y. Числа положительные, действительные, не превосходят 1000, заданы с точностью до шести знаков после запятой.

Программа должна вывести единственное целое число.

Ввод Вывод
10 30
4

N: Утренняя пробежка - 2

И такая задача решалась.

В первый день спортсмент пробежал x километров, а затем он каждый день увеличивал пробег на 70% от предыдущего значения.

По данному числу y определите номер дня, на который суммарный пробег спортсмена составит не менее y километров.

На вход программа получает два числа x и y. Числа положительные, действительные, не превосходят 1000, заданы с точностью до шести знаков после запятой.

Программа должна вывести единственное целое число.

Ввод Вывод
10 100
4

O: Диета

В некоторой сверхсекретной лаборатории изучаются физические возможности животных. Любой живой организм нуждается в трех компонентах пищи —белках, жирах и углеводах. Известен набор продуктов, имеющийся в распоряжении лаборатории и меню животных — сколько единиц каждого продукта они получают. Известно также, сколько белков, жиров и углеводов необходимо для нормальной жизнедеятельности животного. Необходимо определить, получает ли животное достаточное количество питательных веществ.

Известно, что животному требуется в сутки \(X\) белков, \(Y\) жиров и \(Z\) углеводов. Известно также, что всего животное получает в сутки \(N\) продуктов питания, и для каждого из них известны \(A_i\), \(B_i\), \(C_i\) и \(Q_i\) — соответственно энергетическая ценность единицы продукта в белках, жирах и углеводах и количество единиц этого продукта.

В первой строке входных данных записаны числа \(X\), \(Y\) и \(Z\) (действительные неотрицательные числа, не превосходящие 25000, заданные с точностью до 5 знаков после точки). Во второй строке записано целое неотрицательное число \(N\), не превосходящее 25000. Далее на \(N\) строках записаны соответственно \(A_i\), \(B_i\), \(C_i\) и \(Q_i\) (действительные неотрицательные числа, не превосходящие 100, заданные с точностью до 5 знаков после точки).

Выведите YES, если данный пищевой рацион является достаточным по всем параметрам и NO в противном случае.

Задача должна быть решена с использованием арифметики чисел типа float.

Ввод Вывод
1.0 1.0 1.0
3
1 0 0 1
0 0.5 0 2
0 0 0.25 4
YES