Лекция 4 (1160837), страница 2
Текст из файла (страница 2)
==> иногда представления плавающих типов данных не хватает.
С точки зрения программиста любой порт - это 12-битное число.
Относительная точность дельта=(M-N)/(2 в степени L)
А так значение самого сигнала...
Относительная точность дельта=( M-N)2в степени L
В терминах ЯП Ада: (N-M)(2*l)=Н нам нет смысла считать с точностью выше Н
(сам преобразователь «обрежет» наше число).
(На самом деле многие преобразователи имеют собственную внутреннюю систему команд. И эти значения ведут себя как целые числа с фиксированной точностью. Точность считается до 4-го знака(больше не нужно, а меньше нельзя)
ХХХХ
С точки зрения компьютера любые физические измерения являются обратными преобразованиями. Как же с нмии оперировать, заваисит от конкретной архитектуры.
C#
Тип decimal: оперировать с ним можно, а заводить новое десятичное число – нельзя. Зато получить его откуда-то – можно.
Замечание. Что есть финансовая операция в ЯП Cobol? Она является целочисленной, а время при обработке финансовой операции в основном тратится на ввод и вывод.
Специалисты IBM стали открыли производство новых компьютеров с возможностью обработки десятичных чисел, введя для этого специальные «финансовые поля».
Пример. Число 234.ХХХХ
Чтобы ввести какую-то цену, достаточно хранить(если есть двоично-десятичная последовательность чисел) последовательность цифр, которая потом легко преобразовывается в случае надобности в 4 байта:
234.0001
Таким образом, мы ззаводим число и храним его в двоично-десятичном виде.
Из Cobol такие числа перешли в PL-1., а оттуда – в базы данных. А истоки, как мы уже знаем, лежат средствах компьютеров производства фирмы IBM(в Intel, кстати, тоже есть специальные команды для обработки двоично-десятичных значений)
И если хочется, существует поддержка такого типа данных.
Фактически это просто частная реализация(от Cobol и PL1, куда они попали как тип данных.)
Чтобы разрешить возникушую проблему, ввели так называемый дельта-тип или фиксированный тип.
Остальные ЯП вводят паллиативы для совметимости с базами данных(для кодирования вещественных чисел с фиксированной точностью)
Описание фиксированого типа данных следующее:
type T is delta H range M..N
где мы указываем:
H - точность
M..N – диапазон.
Кроме этого, с помощью такого механизма возможно представление сетки вычислений
[M..N]+1
Данные типа Т могут хранится как 12-битные целые числа.
Еще одно замечание. При создании любого ЯП можно оптимизировать либо выполнение, либо экономить память. Язык Ада разрабатывался в 70-е годы самым критичным ресурсом была оперативная память, а следовательно, такой delta хранился в целочисленном виде
С точки зрения выполенния это удобно для программиста – он может смешивать с любым вещественных типом данных
В СССР оператор имеет право отменить любое действие автоматически. На Западе – наоборот
В Ада, напротив, велика нагрузка на компилятор. Мы задаем точность, а компилятор берет на себя ее поддержку. Однако программы, эмулирующие вещественную арифметику, слишком дороги.
Замечание. При рассмотрении базисных типов данных мы много внимания уделяем именно Аде – богатому в этом смысле языку программирования.
С точки зрения математических расчетов Ада недооценен математиками, котрые вполне довольны Фортраном .А ведь Ада будет все счиать очень верно(если, разумеется, верна математическая модель программы)
В таких языках, как С++, С# и Java отсутствуют многие из типов данных, которые есть в Аде. Действительно, не имеет смысла зашивать в С++ какой-то тип данных – веь его может написать в случае надобности мсам программист.Есть соответствующие классы в сответсвующих библиотеках. Ведь, как мы знаем, одно из основных отличи1 современного ЯП – наличие очень мощных средств развития при очень маленьком базисе.
Пример. В чистом С++ нету типа данных String. Зато он есть в STL.
C#, Java и Delphi связаны между собой гораздо больше, чем с С++. Их типы данных, казалось бы, тоже из библиотек, а на самом деле встроены в компилятор.
Пример.
В стандарте языка Паскаль некоторые вещи маскируются под процессы ввода/вывода. Типы – это часть компилятора, но они «маскируются» под классы из стандартной библиотеки.
Еще пример. System.IO.FileStream в C#
Вывод: для современных языков характерно, что некоторые базисные возможости выдают себя за отдельную библиотеку.
Пример.
Для человека естественно, что если дано число(Number), то оно число.
Сейчас серверная часть многих приложений написана на Perl, php, Basic, а клиентские отображения осуществляются при помощи JavaScript.
Пример. Язык LUA. В данном языке есть класс Number, имеющий не эффективное, зато удобное представление(система времени выполнения сама все подбирает). Но в базисных языках программирования должно уделять больше внимания числовым типам данных, и никакого класса Number там быть не может.
Все остальные типы данных опираются на целочисленные типы данных.
Пункт 2.2 Логический тип данных.
Boolean
bool
В старом добром Си логического типа данных нет, зато есть операции :
&& || !
Для логического типа данных существует неявное преобразование к целочисленному типу:
expr=>int !=0 true
=0 false
В языках, не отягощенных совместимостью с Си, в которых логический тип данных есть, он никак не приводится неяявными преобразваниями к целочисленному.
Наличие логического типа данных не обязательно, но в Обероне он есть без него никак нелья
Пункт 2.3 Логический тип данных.
Char – в Си является арифметическим, байтовым типом данных.
char его можно назвать лишь потому, что он используетс лишь дляхранения симвлов В Си не ввели тип данных символов ввиду отсутствия такого тпиа данных в языке Ассемблере и других подобных ему машинных языках. Было бы справедливее, конечно, назвать его byte, а не char.
Возникает проблема представления: что же считать символом?(социальная проблема: что такое алфавит?). Возникла неразбериха, так как алфавиты уу разных естественных языков разные.
Приоритет обработки сивольных типов днных у компьютера выше, числового.
Проблема представления
byte 0..255
множество символов(charset): наименование символа его коду
Примеры различных charset-ов
Любой шрифт основан на charset-е. Именно для кодировки различных символов и придумываются различные charset-ы. Однако вначале они не были стандартиззованы, а при стандартизации получили перенос в сторону некоторых языков программирования.
ASCII-7
Все базисные компании сипользовали кодировку ASCII-7. Число 7 указывало на
число битов. Восьмой бит использовался для контроля четности. Данные хранились лишь в 7-битном виде => большинство програамм при работе с смвольным типом первым делом обнуляла старший бит(Поскольку в 70-е гг интернет использовался в основном для почты, то почтовые сервера только и делали, что обнуляли старший бит)
ASCII-7 «навел порядок», определив набор из 128 символов.
ISO 8559 – набор официальных алфавитов.
Делили charset на 2 половинки: первая 0..127(ASCII-7), вторая – 128-255.
Стандарт кодировал западно-европейские языки. Существовало несколько разновидностей IS0: Latin1, Latin2, Latin5
КОИ -8Р при обулении русского символа (1 бита) превращался в наиболее похожий на него транслитерационный(латинский) символ. Таким образом, письмо после прохождения через КОИ - 8Р можно было прочитать Минус был в том, что коды символов не сответсвовали их упорядоченности я языке программирования.
Кроме КОИ-Р8, была еще и DOS-866.
Однако дальневосточные языки не подходили ни под одну из кодировок(попросту не хватало отведенных 128 битов). 80-е годы- подьем Японии. Япония становится экспортером вычислительных систем До этого все проблемы с алфавитом игнорировались(не было клиентов-японцев). А когда появились – было уже поздно(>6000 иероглифов- правда, там включен английский, и, что забавно, русский , но меньше 7000). Шести с половиной байт должно было хватить для соответствующих вещей.
Все charset-ы(ASCII-7, КОИ -8Р, DOS-866)- DEC(Digital Equipment Corporation Multinational Character Set),
А в китайской кодировке – DBCS(Double Byte Character Set). В японской – MBCS.
Кодировка – это последовательность символов. Ее надо интерпретировать с самого начала. По первому символу(если он <128 , то он кодируется 1-м байтом, если >=128, то двумя байтами). То есть в зависимости от значения первого бита символы интерпретировались так или иначе.
1991 год- появление международного стандарта UNICODE
UCS(Universal Character Set). Версии
-
UCS-2 – двухбайтовая кодировка
-
UCS-4 – четырехбайтовая кодировка (в основном китайская)
-
UCS-1= UCS Latin1(ANCII)
Итак, базовыми международными стандартами были сначала ASCII-7, а затем UCS-1.
Устройство UCS-1:
Любой символ кодировался двумя байтами. Любому языку соответствовал свой промежуток. Первые 0..127 – ASCII-7, 128..255 – ISO Latin1. Затем шел сам алфавит.
ЮНИКОД
Unicode ~ UCS-2. (Существуют некоторые отличия, касающиеся кодировки японских иероглифов) Утвержден ISO.
Все ЯП после 1991 года уже использовали UNICODE (C#, Java)/
Итог.
Символьный тип данных – совершенно отдельный тип данных.
В последней реализация Delphi тип данных String имеет юникодовскую реализацию.
Компания Microsoft всегда придавала большое значение интернационализации, поэтому вся кодировка была Юникодовской.
ОКНА
Окна(выводили информацию в UNICODE)
-
16-битные
-
8-битные