Ошибки вычислений с вещественными числами
Младший значащий разряд результата каждой операции с плавающей точкой может быть неправильный из-за ошибок округления.
1. Исчезновение операнда (ограничение количества знаков)
2. Умножение ошибки - многократное увеличение абсолютной погрешности операнда, которая может появиться при использовании арифметики с плавающей точкой, даже если относительная ошибка мала.
#0.1234*10^3*0.1234*10^3=0.1522*10^5
0.1235*10^3*0.1235*10^3=0.1525*10*5
В 30 раз больше
3. Потеря значимости - полная потеря значимости, вызванная вычитанием почти равных чисел. Также возникает, когда результат вычислений невозможно представить в допустимой форме.
#0.1235 в нулевой – 0.1234 в нулевой = 0.1000 на 10 в минус 3
• Сравнить два вещественных числа НЕЛЬЗЯ
• ‘<=’ и ‘<’ - нет существенного различия
• Правильный способ проверки равенства с плавающей точкой состоит в том, чтобы ввести малую величину и затем сравнить абсолютное значение разности с малой величиной.
• При вычислении вещественных чисел всегда происходит результата до разрядной сетки
Особенности
• В большинстве случаев операции над double занимает не больше времени, чем над float - можно использовать double без страха временных затрат.
• Операции деления, вычисления корня и мат функций быстрее float.
• Сложение, вычитание, умножение и т.п одинаково на большинстве процессоров.
• Для больших массивов лучше использовать float, который занимает меньше памяти, и больше элементов помещается в кэш.
• Float лучше использовать, если используется векторизация.
Смешанная арифметика
• При выполнении арифметических операций компиляторы стараются приводить результаты к более широкому типу, а затем преобразуют результат к типу переменной, в которой он записывается.
• Лучше везде где можно делать явное преобразование типов самому
• Следует обращать внимание на типы переменных.
#int I =7;
Double j=i/2(3)
Double k=i/2.0(3.5)
Символьный тип (char)
Символьный тип - полный аналог целочисленного.
Char занимает 1 байт. Всего 256 вариантов.
При использовании национальных кодировок могут занимать 2 байта и 5.
Для того, чтобы сопоставить числа символы используются таблицы кодировки - ASCII, UTF, Windows..
Операции соответствуют целым числам.
# ‘a’+5;//пятый символ после a.
50. Оператор присваивания. Операторы цикла.
Оператор присваивания - основной оператор любого языка программирования. Общая форма записи оператора:
имя величины := выражение
Например, V:=A; или V:=A+1;
При помощи оператора присваивания переменной могут присваиваться константы и выражения, значения переменных любого типа.
Как только в программе встречается переменная, для неё в памяти отводится место. Оператор присваивания помещает значение выражения в место, отведённое переменной.
Если в процессе выполнения программы встречается переприсваивание (т.е. та же самая переменная принимает другое значение), то старое значение переменной стирается, на свободное место записывается новое значение. Команда присваивания позволяет лучше понять смысл слова переменная (т.е. меняющая своё значение по ходу программы).
Выражение может быть арифметическим, логическим или литерным. Важно, чтобы тип величины был согласован с видом выражения.
Операторы цикла.
Цикл – конструкция языка программирования, реализующая многократное повторение группы операторов. Сама группа операторов – тело цикла. Одно повторение – итерация. Для определения момента, когда следует закончить повторять операторы, существует условия цикла, условие может быть как условием повторения, так и условием останова. Различают циклы с предусловием, и с постусловием. Некоторые циклы могут не выполниться ни разу, а некоторые циклы бесконечные.
FOR, While, repeat, until.
51. Распределение памяти при выполнении программы.
Распределение памяти
Программа обычно помещается в отдельную непрерывную область памяти.
1) Код константы
2) Статические данные
3) Куча
4) Динамическая область памяти
5) Стек
Поскольку области кода констант и статических данных умеют фиксированные размеры, они распределяются в начале памяти. Две области переменной длины – Куча и стек помещаются в противоположные концы остающейся памяти. При таком способе, если программа использует большой стек во время одной фазы вычисления и большую кучу во время другой фазы, то меньше шансов что памяти окажется недостаточно.
Malloc – возвращает нетипизированный указатель, который должен быть явно приведен к требуемому типу данных.
Free – освобождение памяти.
New - выделение.
Delete – освобождение.
Компонент исполняющей системы, который выделяет и освобождает память, называется менеджером кучи.
Это делается посредством поддержки списка свободных блоков памяти. Когда сделан запрос на выделение памяти, она ищется в этом списке, а при освобождении блок снова присоединяется к списку свободных блоков. Таким образом, возникает проблема фрагментации памяти, за которой так же должен следить менеджер кучи. С помощью виртуальной памяти, менеджер кучи может выделять память почти бесконечно, не сталкиваясь с проблемой фрагментации.
<Распределение памяти>
• Программа обычно помещается в отдельную, непрерывную область.
• Код - машинные команды, являются результатом компиляции.
• Константы – небольшие константы, содержащиеся внутри команды.
• Стек - стековая память, используемая для записи активации, которые содержат параметры, переменные и ссылки. Также для временных переменных при вычислениях.
• Статические данные – переменные, объявленные в главной программе и других местах.
• Куча – область данных, из которой данные динамически выделяют специфическими командами для языка.
• Менеджер кучи – компонент исполняющей системы, который выделяет и освобождает память.
• Это делается посредством поддержки списка свободных блоков.
• Когда сделан запрос на выделение памяти, она ищется в этом списке, а при освобождении блок снова подсоединяется к списку свободных блоков.
• Проблема фрагментации – в ходе вычислений блок постепенно разбивается на меньшие блоки посредством процедур выделения памяти, ее восстановления и повторного использования. При этом блоки свободного пространства расщепляются на все более мелкие области.
• Дефрагментация кучи – объединение свободных блоков в блоки большего размера.
52. Куча. Менеджер кучи. Фрагментация динамической памяти.
• Куча – область данных, из которой данные динамически выделяют специфическими командами для языка.
• Менеджер кучи – компонент исполняющей системы, который выделяет и освобождает память.
• Проблема фрагментации – в ходе вычислений блок постепенно разбивается на меньшие блоки посредством процедур выделения памяти, ее восстановления и повторного использования. При этом блоки свободного пространства расщепляются на все более мелкие области.
• Дефрагментация кучи – объединение свободных блоков в блоки большего размера.
<Работа с кучей>
C: void *malloc(size_tколичество _байтов);// выделить память
• Количество_байтов- размер памяти, необходимой для размещения динамического объекта. Тип size_t задан в <stdlib.h> как некоторый целый без знака.
Void free(void*p);//освободить память
В языке с++ для работы с динамическими объектами существует операторы new, delete.
Int *ptr1;
Int *ptr2=new int[256];//размещение динамического массива
Ptr1=ptr2;
Delete []ptr2;//удаление динамического массива