Loading [MathJax]/extensions/tex2jax.js

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

Эти задачи можно сдавать на Python или C++.

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

Дано неотрицательное число, записанное в виде двоичной дроби: запись содержит только цифры 0 и 1 и, возможно, точку. Запись числа содержит не более 30 символов. Переведите это значение в величину типа double и выведите результат с точностью не менее 12 знаков (инструкция cout.precision(12)).

Ввод Вывод
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. Необязательную периодическую дробную часть, записываемую в круглых скобках.

Переведите значение этой дроби в величину типа double и выведите результат с точностью не менее 12 знаков. Общая длина входной строки не превосходит 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\).

Задачи можно сдавать на Python или C++, но в некоторых задачах требуется вывод длинного точноо целого числа, что невозможно сделать в С++.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Эти задачи нужно выполнять на языке С++.

K: Специальные числа

Используя только арифметические операции с типом double в языке C++ получите константы 0, -0, inf, -inf, nan, -nan и выведите их на экран.

Ввод Вывод
 
0
-0
inf
-inf
nan
-nan

L: is_inf

В заголовочном файле math.h есть функция isinf(x), которая возвращает 1, если число равно inf, -1, если число равно -inf, и 0 в остальных случаях. Также есть функция isnan(x), которая проверяет, является ли значение NaN или нет.

Самостоятельно реализуйте аналог (не точный) этой функции, который должен возвращать значение типа bool: для значений inf и -inf функция возвращает true, для всех остальных аргументов функция возвращает false. Решение оформите в виде функции bool is_inf(double x). Функция принимает аргумент, который может быть любым значением типа double, в том числе NaN.

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

bool is_nan(double x)
{
    return x != x;
}

Предполагается решение, использующее свойства числоа inf, состоящее из одной инструкции return.

Вызов функции Возвращаемое значенрие
is_inf(1.0)
false

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

M: Диета

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

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

На первой строке входных данных записаны числа \(X\), \(Y\) и \(Z\). На второй строке записано число \(N\le25000\). Далее на \(N\) строках записаны соответственно \(A_i\), \(B_i\), \(C_i\) и \(Q_i\).

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

Решение должно быть реализовано с использованием действительной арифметики на языке C++, при этом рекомендуется использовать действительные числа расширенной точности (тип long double).

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