лекции (2010) (by Ульянов Алексей_ Лихогруд Николай_ Сергеев Николай) (1160852), страница 4
Текст из файла (страница 4)
В случае ошибкивыхода за границу в Ада возбуждается range error.Сейчас идет возврат к обобщенным типам данных.Вещественные типы данных.При представлении действительных чисел в компьютере, как и целых чисел, используется чаще всегодвоичная система счисления (иногда двоично-шестнадцатеричная), следовательно, предварительнодесятичное число должно быть переведено в двоичную систему, а затем представлено в нормализованномформате с Р = 2 (для двоично-шестнадцатеричной системы Р = 16).Независимо от используемых систем счисления существует два основных типа представления чисел вкомпьютере, называемые представлениями с фиксированной и с плавающей запятой.В типах данных, использующих представление чисел с фиксированной запятой, все разряды ячейки,кроме знакового разряда, служат для изображения разрядов чисел.
Причем каждому разряду ячейкисоответствует всегда один и тот же разряд числа, что и фиксирует место запятой перед определеннымразрядом. Такая система упрощает выполнение арифметических действий, но сильно ограничивает диапазончисел, которые могут быть представлены в таком типе. Чаще всего это бывает диапазон -1 < x < 1. Этотслучай соответствует соглашению: что при чтении чисел, записанных в машине, запятая ставитсянепосредственно перед старшим цифровым разрядом.Наибольшее по абсолютной величине число, которое может быть представлено в машине такимобразом, равно 1 – р-n, наименьшее – отличное от нуля – р-n. Для представления чисел, не укладывающихся вэтот диапазон, программисту надо вводить масштабные множители, т.е.
заменять истинные величины,участвующие в решении задачи, их произведениями на специально подобранные коэффициенты. Этосущественно усложняет решение поставленной задачи. Поэтому для представления вещественных чисел всовременных компьютерах формат данных с фиксированной запятой не применяется.Описанные первой главе целые типы данных представляются в компьютере в формате сфиксированной запятой. Положение запятой в них зафиксировано после правого разряда.Чтобы избавиться от недостатков представления действительных чисел с фиксированной запятой, всовременных ЭВМ принят способ их представления с плавающей запятой.
Этот способ представленияопирается на нормализованную (экспоненциальную) запись чисел:+- M * Bp ( знак/ мантисса/порядок(B- основание системы счисления).Представление в виде мантиссы и порядка не единственно. Для арифметических операция используетсянормализованное представление, то есть 1/B < -M < 0. То есть в системе с основанием B все степени Bпредставимы точно.Еще раз скажу, что при вещественных операциях точность страдает, так мантиссу можно выбрать так, чтопогрешность будет порядка нескольких сотен(не мало да!)Использование как в компьютере, так и в калькуляторе представления чисел с плавающей запятойусложняет схему арифметического устройства.При сложении и вычитании чисел сначала производится подготовительная операция, называемаявыравниванием порядков. Она состоит в том, что мантисса числа с меньшим порядком сдвигается в своейячейке вправо на количество разрядов, равное разности порядков данных чисел.
После этой операцииодноименные разряды чисел оказываются расположенными в соответствующих (одних и тех же) разрядахобеих ячеек, и теперь сложение или вычитание мантисс выполняется достаточно просто, так же как надчислами с фиксированной запятой.При умножении двух чисел с плавающей запятой их порядки складываются, а мантиссы –перемножаются (предварительное выравнивание не производится).При делении из порядка делимого вычитается порядок делителя, а мантисса делимого делится намантиссу делителя.После операций над порядками и мантиссами получается порядок и мантисса результата, но последняяможет не удовлетворять ограничениям, накладываемым на мантиссы нормализованных чисел. Поскольку отрезультата арифметических операций в машине требуется, чтобы он также; был нормализованным числом,необходимо дополнительное преобразование результата, называемое нормализацией.
В зависимости отвеличины получившейся мантиссы результата, она сдвигается вправо или влево так, чтобы ее первая значащаяцифра попала в первый разряд после запятой. Одновременно порядок результата увеличивается илиуменьшается на число, равное величине сдвига.Когда говорят о точности представления вещественных чисел, надо помнить следующее: десятичноечисло, имеющее даже всего одну значащую цифру после запятой, вообще говоря, невозможно записать точнов любом из вещественных типов.
Объясняется это тем, что конечные десятичные дроби часто оказываютсябесконечными периодическими двоичными дробями. Так, 0,110 = 0,0(0011)2, а, значит, и в нормализованномвиде такое двоичное число будет иметь бесконечную мантиссу и не может быть представлено точно. Призаписи подобной мантиссы в ячейку компьютера число не усекается, а округляется.Плавающие числа нужны для представления математических расчетов В других сферах часто требуетсянесколько иное, например если мы работаем с рублями, то нам важна точность до второго порядка послезапятой(копейка). То есть каждое число по идее является целым, но по виду оно вещественное.
И если естьтолько плавающий тип, то при представлении таких чисел неудобно использовать операции с плавающейточкой. Поэтому в некоторых языках ввели delta – типы.Aда: type DATA is delta 1/4096 range –M..MПри этом вся дальнейшая работа по представлению ложится опять на компилятор(он сам лучшеподберет как хранить это число).В других языках появляются еще разновидность delta – типов: С# - decimal, currency.Логический тип данных.Логические, или булевские, данные предназначены для хранения логических значений "истина"(1) или"ложь"(0).
В большинстве языков базис операций над логическим типом сводится к операциям: or, not, and•••И (логическое умножение) (AND, &, *),ИЛИ (логическое сложение) (OR, |, +),Отрицание (NOT, ~, !)Булевый тип данных может быть реализован с использованием только одного бита, но обычноиспользуется минимальная адресуемая ячейка памяти (байт) или машинное слово, как эффективная единицаработы с регистрами и оперативной памятью.Aда: type Boolean is (False, True); // представление типа Booleanp : Boolean := True;...if p then...end if;C#, C, Java, Algol: bool p;Кстати С единственный язык с неявным преобразование int в boolDelphi, Pascal: var p:booleanСимвольный тип данных.Символьный тип (Сhar) — простой тип данных, предназначенный для хранения одного символа вопределённой кодировке.
Может являться как однобайтовым (для стандартной таблицы символов), так имногобайтовым (к примеру, для Юникода).Родина большинство языков программирования – Америка и Европа, алфавиты которых не особоотличаются друг от друга и состоят из не очень большего количества различных букв. Поэтому вполнехватало 1 байта(256 различных символов) для кодирования любого символа. Но со временем стало понятно,что 1 байтом не обойтись( например, в программах где приходилось реализовать многоязычность).
Поэтомулюди стали думать о новых символьных типах данных. И происходило это в 80 – ые годы. Первым путемрешения этой проблемы стало введение различных кодировок, как например ASCII-7, которая жива и ныне(первые 128 служебные, потом идут большие и малые английские буквы, цифры, знаки пунктуации…). Многиекодировки содержат первые 128 символов, такие же как в ASCII-7, и что – то свое. Проблемы осложнилиськогда дело дошло до Китая и Японии(появилось еще множество новых кодировок…) Чтобы хоть как – тоуладить проблемы с большим количеством различных кодировок в 91 году появляется стандарт Unicode.
Нанем остановимся чуть поподробнее. Юнико:д, или Унико:д (англ. Unicode) — стандарт кодирования символов,позволяющий представить знаки практически всех письменных языков.Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. UnicodeConsortium, Unicode Inc.). Применение этого стандарта позволяет закодировать очень большое числосимволов из разных письменностей: в документах Unicode могут соседствовать китайские иероглифы,математические символы, буквы греческого алфавита, латиницы и кириллицы, при этом становятсяненужными кодовые страницы.
Рассмотрим наиболее популярный формат UTF-8.UTF-8 (от англ. Unicode Transformation Format — формат преобразования Юникода) — в настоящее времяраспространённая кодировка, реализующая представление Юникода, совместимое с 8-битным кодированиемтекста. Нашла широкое применение в операционных системах и веб-пространстве Unicode и его роль в вебпространстве.Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычныйтекст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII стем же кодом.
Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байтов(реально только до 4 байтов, поскольку использование кодов больше 221 не планируется), в которых первыйбайт всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.Проще говоря, в формате UTF-8 символы латинского алфавита, знаки препинания и управляющие символыASCII записываются кодами US-ASCII, a все остальные символы кодируются при помощи нескольких октетовсо старшим битом 1. Это приводит к двум эффектам.•••Даже если программа не распознаёт Юникод, то латинские буквы, арабские цифры и знакипрепинания будут отображаться правильно.В случае, если латинские буквы и простейшие знаки препинания (включая пробел) занимаютсущественный объём текста, UTF-8 даёт выигрыш по объёму по сравнению с UTF-16.[1][2]На первый взгляд может показаться, что UTF-16 удобнее, так как в ней большинство символовкодируется ровно двумя байтами.