Представление вещественных чисел в памяти.
В некоторых областях вычислений требуются очень большие или весьма малые действительные числа. Для получения большей точности применяют запись чисел с плавающей точкой. Запись числа в формате с плавающей точкой является весьма эффективным средством представления очень больших и весьма малых вещественных чисел при условии, что они содержат ограниченное число значащих цифр, и, следовательно, не все вещественные числа могут быть представлены в памяти. Обычно число используемых при вычислениях значащих цифр таково, что для большинства задач ошибки округления пренебрежимо малы.
Формат для представления чисел с плавающей точкой содержит одно или два поля фиксированной длины для знаков. Количество позиций для значащих цифр различно в разных ЭВМ, но существует, тем не менее, общий формат, приведенный на рисунке 2.5 а). В соответствии с этой записью формат вещественного числа содержит в общем случае поля мантиссы, порядка и знаков мантиссы и порядка.
Рис. 2.5. Формат представления вещественных чисел
Однако, чаще вместо порядка используется характеристика, получающаяся прибавлением к порядку такого смещения, чтобы характеристика была всегда положительный. При этом имеет место формат представления вещественных чисел такой, как на рис 2.5 б).
Введение характеристики избавляет от необходимости выделять один бит для знака порядка и упрощает выполнение операций сравнения (<,>,<=,>=) и арифметических операций над вещественными числами. Так, при сложении или вычитании чисел с плавающей точкой для того, чтобы выровнять операнды, требуется сдвиг влево или вправо мантиссы числа. Сдвиг можно осуществить с помощью единственного счетчика, в который сначала заносится положительное чис- ло, уменьшающееся затем до тех пор, пока не будет выполнено требуемое число сдвигов.
Таким образом, для представления вещественных чисел в памяти ЭВМ порядок p вещественного числа представляется в виде характеристики путем добавления смещения (старшего бита порядка):
Х = 2^(n-1) + k + p, (2.1)где:
- n - число бит, отведенных для характеристики,
- p - порядок числа,
- k - поправочный коэффициент фирмы IBM, равный +1 для real
- и -1 для форматов single, double, extended.
Формулы для вычисления характеристики и количество бит, необходимых для ее хранения, приведены в таблице 2.2.
Тип | Харрактеристика | Кол-во бит на хар-ку |
real | x = 2^7 + p + 1 | |
single | x = 2^7 + p - 1 | |
double | x = 2^10 + p - 1 | |
extended | x = 2^14 + p - 1 |
Битовые типы
Представление битовых типов.
В ряде задач может потребоваться работа с отдельными двоичными разрядами данных. Чаще всего такие задачи возникают в системном программировании, когда, например, отдельный разряд связан с состоянием отдельного аппаратного переключателя или отдельной шины передачи данных и т.п. Данные такого типа представляются в виде набора битов, упакованных в байты или слова, и не связанных друг с другом. Операции над такими данными обеспечивают доступ к выбранному биту данного. В языке PASCAL роль битовых типов выполняют беззнаковые целые типы byte и word. Над этими типами помимо операций, характерных для числовых типов, допускаются и побитовые операции. Аналогичным образом роль битовых типов играют беззнаковые целые и в языке C.
В языке PL/1 существует специальный тип данных - строка битов, объявляемый в программе, как: BIT(n).
Данные этого типа представляют собой последовательность бит длиною n. Строка битов занимает целое число байт в памяти и при необходимости дополняется справа нулями.
Логический тип
Значениями логического типа BOOLEAN может быть одна из предварительно объявленных констант false (ложь) или true (истина).
Данные логического типа занимают один байт памяти. При этом значению false соответствует нулевое значение байта, а значению true соответствует любое ненулевое значение байта. Например: false всегда в машинном представлении: 00000000; true может выглядеть таким образом: 00000001 или 00010001 или 10000000.
Однако следует иметь в виду, что при выполнении операции присваивания переменной логического типа значения true, в соответствующее поле памяти всегда записывается код 00000001.
Над логическими типами возможны операции булевой алгебры - НЕ (not), ИЛИ (or), И (and), исключающее ИЛИ (xor) - последняя реализована для логического типа не во всех языках. В этих операциях операнды логического типа рассматриваются как единое целое - вне зависимости от битового состава их внутреннего представления.
Кроме того, следует помнить, что результаты логического типа получаются при сравнении данных любых типов.
Интересно, что в языке C данные логического типа отсутствуют, их функции выполняют данные числовых типов, чаще всего - типа int. В логических выражениях операнд любого числового типа, имеющий нулевое значение, рассматривается как "ложь", а ненулевое - как "истина". Результатами логического типа являются целые числа 0 (ложь) или 1 (истина). Логическая структура.
Один из способов образования новых типов из уже существующих - ограничение допустимого диапазона значений некоторого стандартного скалярного типа или рамок описанного перечислимого типа. Это ограничение определяется заданием минимального и максимального значений диапазона. При этом изменяется диапазон допустимых значений по отношению к базовому типу, но представление в памяти полностью соответствует базовому типу.
29. Стратегия реализации алгоритмов.
Паттерн "Стратегия" применяется в ситуациях, когда общую проблему нужно решить с помощью нескольких разных алгоритмов в зависимости от контекста.
Выбор решения может основываться на выборе пользователя. Например, программы для работы с графикой позволяют сохранять изображения в разных графических форматах, каждый из которых имеет уникальный код. Однако процесс выбора каждого из форматов одинаков.
Этот паттерн может решить проблему представления веб-приложения на различных языках или стилях. Простейшие схемы могут быть получены на основе массива переведенных слов или массива цветов для темы (theme), но сложные настройки могут требовать значительного кодирования для достижения динамического вывода. Я столкнулся с такой проблемой, когда делал интернациональные версии сайта электронной коммерции.
Кроме языковых различий, в разных странах могут быть свои единицы измерения или представление формата чисел. Функция number_format может решить некоторые проблемы, однако она не поможет с денежными единицами. Американцы используют знак $ слева от суммы. Европейцы могут использовать EUR или знак евро.
Для реализации паттерна "Стратегия", вы должны разработать общий интерфейс для всех алгоритмов. Затем можно делать различные реализации этого интерфейса. В PHP это можно реализовать с помощью создания общего класса, от которого будут наследоваться подклассы. В этом случае можно пользоваться преимуществом полиморфизма.
Ниже приведен базовый класс localization. В нем определено два метода formatMoney и translate. Первый метод возвращает формат денежных единиц. Второй метод возвращает переведенную с английского фразу. Базовый класс определяет базовую функциональность, которая может быть расширена в подклассах.
<?php //Strategy super class class localization { function formatMoney($sum) { number_format($sum); } function translate($phrase) { return($phrase); } } ?>