Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
К_Глава 3_Представление данных.doc
Скачиваний:
36
Добавлен:
19.05.2015
Размер:
156.16 Кб
Скачать

100000001100011100111110

01010100

=8439614х284

31 24 23 0

Число с плавающей двоичной точкой

Число с плавающей точкой, таким образом, состоит из двух битовых по­лей — мантиссы М и порядка Е. Число, представленное двумя такими по­лями, равно Мх2E. Нормализация состоит в отбрасывании всех старших ну­лей, поэтому старший бит нормализованной двоичной мантиссы всегда равен 1. Большинство современных реализаций чисел с плавающей точкой используют этот факт для того, чтобы объявить незначащими не только старшие нули, но и эту единицу, и, таким образом, выигрывают дополни­тельный бит точности мантиссы.

Сложение двух чисел с плавающей точкой состоит в денормализациимантисс (совмещении двоичных точек), их сложении и нормализации результата. Перемножение таких чисел, соответственно, выполняется перемножением мантисс, сложением порядков и опять-таки нормализацией результат.

Стандарт языка ANSI С требует наличия 32-битового (8-разрядный порядок и 24-разрядная мантисса) и 64-битового (16-разрядный порядок и 48-раз рядная мантисса) представлений чисел с плавающей точкой, которые назы­ваются, соответственно, числами одинарной и двойной точности (float и double float или просто double). Числа двойной точности, конечно же, не могут быть результатом прямых измерений физических величин, но позволяют избе­жать накопления ошибок округления при вычислениях. Часто на уровне системы команд реализуются и элемен­тарные функции: экспонента, логарифм, квадратный корень, синус, косинус и т. д. Процессоры ЦОС нередко предоставляют и отдельные шаги дискрет­ного преобразования Фурье.

Количество операций с плавающей точкой в секунду (Floating Operations Per Second, FLOPS, в наше время чаще говорят о Mflops — миллионах операций в секунду), которые может исполнять процессор, является одной из важных его характеристик, хотя и не для всех приложений эта характеристика критична.

3. Представление текстовых данных

Системы кодирования

Все используемые способы представления текстовых данных, так или иначе, сводятся к нумерации символов алфавита (или множества символов системы письменности интересующего нас языка, которое используется вместо алфавита — слоговой азбуки, иероглифов и т. д.) и хранения полученных целых чисел наравне с обычными числами. Способ нумерации называется кодировкой, а числа — кодами символов. Для большинства кодировок языков, использующих алфавитную письменность (латиница, кириллица, арабский алфавит, еврейский и греческий языки) достаточно 127 символов. Самая распространенная система кодирования латиницы — ASCII(American Standard Code for Information Interchange — Американский стандартный код обмена информацией) — использует 7 бит на символ. Другие алфавиты обычно кодируются более сложным образом: символы алфавита получают коды в диапазоне от 128 до 255, а коды от 0 до 127 соответствуют кодам ASCII. Таким образом, любой символ этих алфавитов, в том числе и в многоязычных текстах, использующих сочетание национального алфавита и латиницы, может быть представлен 8-ю битами или одним байтом. Но для японских слоговых азбук, а тем более, для китайской иероглифики, 255 кодов явно недостаточно, и приходится использовать многобайтовые кодировки. Рас­пространенное обозначение таких кодировок —DBCS (Double Byte Character Set — набор символов, кодируемый двумя байтами). Двух байтов, в принципе, достаточно, чтобы сформировать единую кодировку для всех современных алфавитов и основных подмножеств иероглифики. Попытка стандартизовать такое представление —Unicode.

Используются две основные кодировки латиницы — ASCIIиEBCDIC (Extended Binary Coded Decimal Information Code), применяемая системами AS/400, System/370, System/390 и z90 фирмы IBM. Для представлениярус­ского варианта кириллицысуществует три основных кодировки:альтерна­тивная(известная также как ср866),ср1251иKOI-8 и ряд менее широко используемых (ISO 8892-5и др.).

Операции сравнения . Промежуточные таблицы.

Арифметические операции над такими “числами” обычно бессмысленны, зато большой смысл имеют операции сравнения. Проще всего это делать, если нумерация символов совпадает с их порядком в алфавите, но да­леко не для всех распространенных кодировок это справедливо.

В кодировке ASCII например, все символы латиницы, цифры и большинство распространенных знаков препинания обозначаются кодами от 0 до 127, при этом коды букв расставлены в соответствии с латинским алфавитом. В США, как и в других англоязычных странах, латинский алфавит используется в неизмененном виде, а для передачи звуков, отсутствовавших в оригинальном латинском языке, применяется причудливая орфография. Большинство других европейских алфавитов проблему несоответствия фонетик решают путем расширения набора символов латиницы — например, в немецком языке добавлены буквы ö, ä, ü и B. Другие языки имеют множество различных “акцентов” и “диакритических символов”, расставляемых над буквами для указания особенностей произношения. Некоторые языки, например французский, используют одновременно и расширения алфавита, и причудливую орфографию. Нередко встречаются и дополнительные знаки препинания, например, iв испанском языке.

Все символы-расширения в каждом из национальных алфавитов находятся на определенных местах, но при использовании кодировки ASCII для представления этих символов сохранить этот порядок невозможно — соответствующие коды уже заняты. Так, в кодировке ISO 8895-1 все символы латиницы кодируются в соответствии с ASCII, а коды расширений более или менее произвольно раскиданы между 128 и 255. Более яркий пример той же проблемы — кодировки кириллицы семейства KOI, в которых символы кириллицы сопоставлены фонетически соответствующим им символам латиницы (филе нот фоунд, или, наоборот, esli wy ne movete pro^itatx eto po-russki, smenite kodirovku). Естественно, совместить такое сопоставление и алфавитную сортировку невозможно.

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

Обмен данными с разными кодировками.

1. При обмене данными между системами, использующими разные кодировки необходимо учитывать этот факт. Стандартный способ такого учета, применяемый во многих кросс-платформенных форматах документов (HTML MIME) — это сообщение где-то в теле документа (обычно в его начале) или в передаваемой вместе с документом метаинформации об используемых языке и кодировке. Большинство средств просмотра почты и документов HTML умеют интерпретировать эту метаинформацию, поэтому конечный пользователь все реже и реже сталкивается с необходимостью самостоятельно разбираться в различных кодировках.

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

2. Два основных подхода к представлению форматированного текста — это языки разметки и сложные структуры данных, используемые в текстовых процессорах. Примерами языков разметки являются HTML, LATEX, troff. В этих языках обычный текст снабжается командами, указывающими на то, каким шрифтом следует отображать конкретный фрагмент текста и как его следует форматировать (например, какова ширина параграфа, следует ли делать переносы в словах, надо ли выравнивать текст по левому или правота краю). Команды представляют собой специальные последовательности символов той же кодировки, в которой набран и основной текст. Отформатированные таким образом тексты могут генерироваться как вручную, так различными автоматизированными средствами.

  1. Представление изображений

Все известные форматы представления изображений (как неподвижных, так и движущихся) можно разделить на векторные и растровые.

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

Каждый примитив описывается своими геометрическими координатами. Точность описания в разных форматах различна, нередко используются числа с плавающей точкой двоичной точности или с фиксированной точкой с точностью до 16-го двойного знака.

Координаты примитивов бывают как двух-, так и трехмерными. Для трехмерных изображений, естественно, набор примитивов расширяется, в него включаются и различные поверхности — сферы, эллипсоиды и их сегменты, параметрические многообразия и др.

Двухмерные векторные форматы очень хороши для представления чертежей, диаграмм, шрифтов (или, если угодно, отдельных букв шрифта) и отформатированных текстов. Такие изображения удобно редактировать — изображения и их отдельные элементы легко поддаются масштабированию и другим преобразованиям. Примеры двухмерных векторных форматов — PostScript, PDF (Portable Document Format, специализированное подмножество PostScript), WMF (Windows MetaFile), PCL (Printer Control Language, система команд принтеров, поддерживаемая большинством современных лазерных и струйных печатающих устройств). Примером векторного представления движущихся изображений является MacroMedia Flash. Трехмерные векторные форматы широко используются в системах автоматизированного проектирования и для генерации фотореалистичных изображений метола ми трассировки лучей и т. д.

Однако преобразование реальной сцены (например, полученной оцифровкой видеоизображения или сканированием фотографии) в векторный формат представляет собой сложную и, в общем случае, неразрешимую задачу. Программы-векторизаторы существуют, но потребляют очень много ресурсов, а качество изображения во многих случаях получается низким. Самое же главное — создание фотореалистичных (фотографических или имитирующих фотографию) изображений в векторном формате, хотя теоретически и, возможно, на практике требует большого числа очень сложных примитивов. Гораздо более практичным для этих целей оказался другой подход к оцифровке изображений, который использует большинство современных устройств визуализации: растровые дисплеи и многие печатающие устройства.

В растровом форматеизображение разбивается на прямоугольную матрицу элементов, называемыхпикселами(слегка искаженное PICture Element — элемент картинки). Матрица называетсярастром. Для каждого пиксела оп­ределяется его яркость и, если изображение цветное, цвет. Если, как это часто бывает при оцифровке реальных сцен или преобразовании в растро­вый формат (растеризации) векторных изображений, в один пиксель попали несколько элементов, их яркость и цвет усредняются с учетом занимаемой площади. При оцифровке усреднение выполняется аналоговыми контурами аналого-цифрового преобразователя, при растеризации — алгоритмамианти-алиасинга.

Размер матрицы называется разрешением растрового изображения.Для печатающих устройств (и при растеризации изображений, предназначенных для таких устройств) обычно задается не неполный размер матрицы, соответствующей всему печатному листу, а количество пикселей, прихо­дящихся на вертикальный или горизонтальный отрезок длиной 1 дюйм; соответствующая единица так и называется — точки на дюйм (DPI, Dots Per Inch).

Для черно-белой печати обычно достаточно 300 или 600 DPI. Однако прин­теры, в отличие от растровых терминалов, не умеют манипулировать ярко­стью отдельной точки, поэтому изменения яркости приходится имитиро­вать, разбивая изображение на квадратные участки и регулируя яркость относительным количеством черных и белых (или цветных и белых при Цветной печати) точек в этом участке. Для получения таким способом приемлемого качества фотореалистичных изображений 300 DPI заведомо недос­таточно, и даже бытовым принтерам приходится использовать гораздо более высокие разрешения, вплоть до 2400 DPI.

Вторым параметром растрового изображения является разрядность од­ного пикселя, которую называют цветовой глубиной. Для черно-белых изображений достаточно одного бита на пиксель, для градаций яркости серого или цветовых составляющих изображения необходимо несколько бит.В цветных изображениях пиксель разбивается на три или четыре составляющие, соответствующие разным цветам спектра. В промежуточных данных, используемых при оцифровке и редактировании растровых изображении, цветовая глубина достигает 48 или 64 бит (16 бит на цветовую составляющую). Яркостный диапазон современных мониторов, впрочем, позволяет ограничиться 8-ю битами, т. е. 256 границами, на одну цветовую составляющую: большее количество градаций просто незаметно глазу.

Наиболее широко используемые цветовые модели — это RGB (Red, Gree Blue — красный, зеленый, синий, соответствующие максимумам частотной характеристики светочувствительных пигментов человеческого глаза), СМ (Cyan, Magenta, Yellow— голубой, пурпурный, желтый, дополнительные RGB) и CMYG — те же цвета, но с добавлением градаций серого. Цветовая модель RGB используется в цветных кинескопах и видеоадаптера: CMYG — в цветной полиграфии.

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