- •Что делать
- •Просто о “длинных” числах
- •Массивы в Си
- •Ввод длинного числа с клавиатуры
- •Как это будет на Си?
- •Сложение двух чисел
- •Умножение длинного числа на длинное
- •Несколько слов о реализации
- •Заключение
- •Задачи на длинную арифметику
- •Задачи для самостоятельного решения
- •Список использованной литературы
- •Проверочная работа
- •1 Вариант
- •2 Вариант
- •Представление вещественных чисел
- •Нормальная и нормализованная форма
- •Типы чисел с плавающей точкой (по ieee 754) Число половинной точности (Binary16, Half precision)
- •Число одинарной точности (Binary32, Single precision, float)
- •Число двойной точности (Binary64, Double precision, double)
- •Число четверной точности (Binary128, Quadruple precision)
- •Диапазон значений чисел с плавающей запятой
- •Особые значения чисел с плавающей точкой Ноль (со знаком)
- •Неопределенность (NaN)
- •Бесконечности
- •Денормализованные числа
- •Действия с числами с плавающей запятой Умножение и деление
- •Сложение и вычитание
- •Алгоритм получения представления вещественного числа в памяти эвм
- •Ссылки Использованные материалы
- •Что стоит прочесть
Лаб4. Кодирование чисел Основы информатики
Содержание
Что делать 2
Просто о “длинных” числах 2
3
Массивы в Си 3
Ввод длинного числа с клавиатуры 4
Как это будет на Си? 4
Сложение двух чисел 4
Цифры и ASCII-коды в Си 5
Вывод числа на экран 5
Как это сделать в Си 5
Умножение длинного числа на короткое 5
Умножение длинного числа на длинное 6
Несколько слов о реализации 6
Заключение 7
ЗАДАЧИ НА ДЛИННУЮ АРИФМЕТИКУ 7
Задачи для самостоятельного решения 11
Список использованной литературы 13
Проверочная работа 13
Представление вещественных чисел 14
Нормальная и нормализованная форма 15
Типы чисел с плавающей точкой (по IEEE 754) 16
Число половинной точности (Binary16, Half precision) 16
Число одинарной точности (Binary32, Single precision, float) 17
Число двойной точности (Binary64, Double precision, double) 17
Число четверной точности (Binary128, Quadruple precision) 18
Диапазон значений чисел с плавающей запятой 18
Особые значения чисел с плавающей точкой 19
Ноль (со знаком) 19
Неопределенность (NaN) 20
Бесконечности 21
Денормализованные числа 21
Действия с числами с плавающей запятой 23
Умножение и деление 23
Сложение и вычитание 23
Алгоритм получения представления вещественного числа в памяти ЭВМ 24
Ссылки 25
Использованные материалы 25
Что стоит прочесть 26
Тесты http://www.amse.ru/archive/tests/index.php
Что делать
Определить машинный эпсилон. Вот возможный алгоритм:
float macheps(void)
{
float e = 1.0f;
while (1.0f + e / 2.0f > 1.0f)
e /= 2.0f;
return e;
}
Машинный эпсилон (англ. Machine epsilon) — числовое з начение, меньше которого невозможно задавать точность для любого алгоритма, возвращающего вещественные числа. Абсолютное значение «машинного эпсилон» зависит от разрядности сетки применяемой ЭВМ, от принятой в конкретном трансляторе точности представления вещественных чисел и от значений, используемых для оценки точности.[1]
В языке Си существуют предельные константы FLT_EPSILON и DBL_EPSILON называемые «машинными эпсилон» относительно вещественного значения 1.0. FLT_EPSILON — максимальное значение типа float и имеет значение 1.2E-7, DBL_EPSILON — максимальное значение типа double и имеет значение 2.2E-16. Сумма каждого из этих значений со значением 1.0 не отличается от 1.0.
Проблема машинного эпсилон в том, что два числа считаются одинаковыми, если они отличаются на величину, меньшую по модулю, чем машинный эпсилон.
Решите задачу Задача №74. a + b = c
Прочитать раздел «Просто о длинных числах». Реализовать рассмотренные в нем процедуры. Протестировать вычисления.
Решить задачи 1 и 2 из раздела «Задачи для самостоятельного решения» стр. 9.
Выполнить проверочную работу стр. 14 по вариантам.
Представление вещественных чисел (дополнительные материалы к лекции) – для самостоятельного изучения.
Просто о “длинных” числах
В.Гуровиц, 16.05.2010
В этом тексте обсуждаются задачи, в которых возникает необходимость работать с натуральными числами, которые настолько велики, что не входят ни в один тип данных. Мы будем предполагать, что все числа не превосходят 1000 символов.
Разобьем число на отдельные цифры и запишем каждую из них в отдельный элемент массива, причем записывать будем справа налево. Скажем, число 20134 запишется так:
4 |
3 |
1 |
0 |
2 |
0 |
0 |
0 |
… |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
a[7] |
a[8] |
a[9] |
Такой способ хранения решает сразу две проблемы. Во-первых, при сложении и умножении “столбиком” числа не придется “выравнивать”, разряды единиц, десятков, сотен, … А во-вторых, при переносе в старший разряд (когда результат длиннее исходных чисел), для него всегда есть место справа. Для удобства мы заведем массив из 1 000 элементов.
Обратите внимание: так реализация, которую мы здесь обсуждаем, требует, чтобы все “пустые” ячейки были заполнены нулями. Следите за этим внимательно!
Массивы в Си
Типа данных «массив» в Си нет, но есть указатель на целое и возможность выделить заданное количество таких целых:
int a[1000], b[1000], c[1000];
Такие объекты и называют в Си массивами. Каждый из массивов a, b, c состоит из 1000 целых. Доступ к каждому целому массива получают по индексу (номеру целого в массиве, или номеру элемента массива): a[1], b[i], c[I + 1]. Важно! Нумерация ведется от нуля, то есть массив a состоит из элементов a[0], a[1], a[2],…, a[999].
Способы заполнения массива нулями. Простейший способ – инициализация при объявлении:
int a[1000] = {0}, b[1000] = {0}, c[1000] = {0};
Способ посложнее – использовать функцию memset:
void * memset ( void * ptr, int value, size_t num );
Например, так
int a[1000], b[1000] = {0}, c[1000] = {0};
memset (a, 0, 1000 * sizeof(int) );
Или в цикле (медленно и неэффективно)
int a[1000], b[1000] = {0}, c[1000] = {0};
int i;
for(i = 0; i < 1000; i++)
a[i] = 0;
