Опубликован: 23.10.2009 | Уровень: для всех | Доступ: свободно
Лекция 5:

Типы данных

< Лекция 4 || Лекция 5: 12 || Лекция 6 >

5.4. Арифметика плавающей точки

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

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

5.4.1. Представление чисел с плавающей точкой

Число с плавающей точкой представляет собой вещественное число, имеющее целую часть и дробную часть, представляющую последовательность нулей и единиц (то есть обычные числа, получающиеся в результате измерения). В компьютере они представляются в виде мантиссы и порядка. Понятие мантиссы и порядка дается в шестом классе курса алгебры средней школы. Напомним его:

При численных вычислениях удобно пользоваться следующей формулой вещественных чисел:

0.<мантисса>·10<порядок>
Листинг 5.1.

например:

0.123·103
Листинг 5.2.
0.25·1010
Листинг 5.3.

В первом примере мантисса равна 0,123, а порядок соответствует числу 3. Итого получили число 123. Во втором примере мантисса равна 0.25, а порядок - 10 (получилось число 2 миллиарда 500 миллионов). Мантисса всегда задает точность, с которой представлены вещественные числа. Чем количество разрядов в мантиссе больше, тем выше точность расчета. В приведенном примере мантисса первого числа больше мантиссы второго числа, хотя второе число много больше первого. Порядок определяет "разряд", с которого начинается "отсчет" начала значения мантиссы.

Представление чисел с плавающей точкой в ЭВМ также происходит с помощью нулей и единиц, однако их формат отличается от формата целых чисел (см. [40]). Схематично его можно представить следующим образом:

<знак><мантисса><знак порядка><порядок>
Листинг 5.4.

Длина же машинного представления чисел с плавающей точкой равна 4, 8 и 10 байт. При этом число в регистре длиной 4 байта имеет тип float (или real), в регистре длиной 8 байт - double, в регистре длиной 10 байт - long double.

В таблице 5.5 представлены максимальные и минимальные значения, принимаемые числами с плавающей точкой в регистрах с различной разрядностью. В таблице 5.6 дается соответствие между разрядностью регистров чисел с плавающей точкой и их обозначениях в языках Quick Basic, Си, C++ и Java.

Таблица 5.5. Минимальные и максимальные значения чисел в регистрах с плавающей точкой
Тип регистра Мантисса Порядок
min max min max
4 байта 1,18 3,40 -38 38
8 байт 2,23 1,79 -308 308
10 байт 3,37 1,18 -4 932 4 932
Таблица 5.6. Соответствие между разрядами регистров с плавающей точкой и связанных с ними типов данных
Разрядность регистров Обозначение Примечание Префикс
Quick Basic
8 байт <идентификатор> Тип по-умолчанию
Java
4 байта float Не реализован в J# f
8 байт double d
C/C++
4 байт float f
8 байт double d
10 байт long double ld

5.4.2 Арифметика чисел с плавающей точкой

С данными в виде чисел с плавающей точкой возможны следующие операции:

  • сложение;
  • вычитание;
  • умножение;
  • деление;
  • возведение в степень;
  • нахождение остатка от деления (не во всех языках);
  • смена знака числа;
  • инкремент числа;
  • декремент числа;
  • отношение "больше" и "меньше";
  • а также доступны другие алгебраические функции.

Все эти операции, их обозначения, действия, а также приоритет операций и комментарии к ним представлены в таблице 5.3.

5.4.3. Особые ситуации при работе с числами с плавающей точкой

Арифметика с плавающей точкой имеет следующие программные прерывания:

  • деление на ноль (divide by zero) - попытка деления на ноль;
  • переполнение мантиссы (overflow) - положительное или отрицательное число в регистре выходит за свои максимальные значения;
  • переполнение порядка - в результате умножения порядок превысил свое максимальное либо минимальное значение;
  • исчезновение порядка - обнуление мантиссы при минимальном значении порядка.

Возможны и другие прерывания.

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

5.5. Резюме

Итак, после прослушивания данной лекции Вы узнали:

  • Существует два типа данных: "машинные" (которые определяются архитектурой вычислительных машин) и "пользовательские" (определенные системными и прикладными программистами). Первый тип данных представлен в лекциях "Типы данных" и "Примитивные символьные данные" ], второй - в "Другие типы данных" и "Переменные Perl" . В данном описании не рассматриваются классы - это прерогатива отдельной темы.
  • Концепция "типов данных" реализована в большинстве "настоящих" языков программирования, но отсутствует в "скриптовых" языках (языках написания макросов).

В следующей лекции Вы познакомитесь с "примитивными символьными" данными.

5.6. Глоссарий

Термин Английский термин Разъяснение
тип данных data type Термин, определяющий отнесение ячеек памяти по их содержимому, формату и назначению к определенным группам в ЭВМ и языках программирования Типы данных определяют допустимые для них процедуры, функции и операции.
программирование 1. programming 1. Процесс написания программ на языках программирования.
программа program Реализация алгоритма на языке программирования для его обработки на ЭВМ. Эта реализация подразумевает использование определенных типов данных.
язык программирования 1. programming language 1. Программный комплекс, позволяющий подготовить и реализовать некоторый алгоритм для выполнения на ЭВМ.
язык программирования 2. programming language 2. Некоторые правила, с помощью которых алгоритм преобразуется в программу для ЭВМ. Эти правила накладывают ограничения на синтаксис, типы данных, языковые конструкции, процедуры и функции. Эти ограничения могут иметь принципиальное значение на реализацию алгоритма, поэтому выбор языка определяется на ранних этапах разработки проекта.
процедура procedure Основная единица процедурного программирования. Процедура - это обособленная часть общего алгоритма, имеющая самостоятельное значение и разбивающая общую программу на части, простые в описании, а значит - легкие в реализации. В более узком смысле процедура - это подпрограмма (subroutine), не возвращающая значения, кроме параметров, передаваемых по ссылке.
функция 1. function 1. В узком смысле - подпрограмма, возвращающая единственное значение - значение функции.
алгоритм algorithm Последовательность действий, приводящая к определенному однозначному результату.
машинные типы данных computer data types Типы данных, поддерживаемые архитектурой вычислительных машин (прежде всего - микропроцессором) и "зашитые" в реализацию языков программирования 1.
пользовательские типы данных user data types Типы данных, созданные пользователем ЭВМ или системным программистом на основе машинных типов данных.
класс class Пользовательский тип данных, описанный в терминах объектно-ориентированного программирования (ООП). Включает в себя как данные, так и методы (разновидность процедур и функций).
приведение типов reduction of the types В языках программирования - изменение типа данных при реализации алгоритмов. С помощью приведения типов можно, например, результат целочисленной арифметики присвоить переменной плавающей точки. Операция приведения типов может не работать в контекстно-зависимых языках, таких как Perl.
принудительное приведение типов forced reduction of the types Явное, не зависящее от реализации языка программирования (1) изменение типов данных для выражений и функций этого языка. Принудительным приведением типов нужно пользоваться с осторожностью, поскольку эти операции не генерируют ошибок (переполнения, исчезновения значащих разрядов, например). Но часто это единственный способ заставить работать функцию.
приведение типов по-умолчанию default reduction of the types Встроенный в язык высокого уровня алгоритм приведения типов данных. Приведение типов на языке Си происходит по следующей схеме: char -> unsigned char -> short -> unsigned short -> long -> unsigned long -> float -> double -> long double. Только при такой схеме приведения типов значение переменных не теряется. Принудительное приведение типов в обратном порядке чревато потерей информации (в результате отбрасывания старших разрядов числа).
бит 1. bit 1. Единица информации в информатике, которая может принимать одно из двух значений: "0" или "1".
бит 2. bit 2. Минимальная ячейка памяти, предназначенная для хранения двоичного разряда.
байт 1. byte 1. Единица информации, состоящая из 8 битов. С помощью одного байта можно представить до 256 символов, что достаточно для представления алфавитов европейских языков (см. кодировки).
байт 2. byte 2. Кратная байту (1) ячейка памяти в ЭВМ. Байт - минимальная единица информации, воспринимаемая ЭВМ. Все ячейки в ЭВМ выровнены по границам байта.
ячейка памяти memory cell Устройство в ЭВМ (регистр, конденсаторная ячейка и т.п.), способное записывать, хранить в себе и выдавать по запросу двоичные числа. Представляет собой последовательность битов и байтов.
сжатие с потерями lossy compression Алгоритм "упаковки", "уплотнения" информации с "отбрасыванием" не воспринимаемых человеком данных. Сжатие с потерями используется в алгоритмах "сжатия" музыки и видео - MPEG, "реалистичных" изображений JPEG и других.
полуслово semiword Ячейка памяти размером в два байта. Термин используется в "многоразрядных" ЭВМ.
слово word Ячейка памяти размером в два байта (для процессоров семейства x86) или четыре байта (для "многоразрядных" процессоров).
двойное слово double word Ячейка памяти размером от 4 байтов (для процессоров семейства x86) и от 8 байтов (для "многоразрядных" процессоров).
назначение регистра function of a register Выполняемая функция регистров в микропроцессорах. В современных процессорах существуют регистры общего назначения, сегментные регистры и регистры флагов.
РОН general-purpose register См. регистр общего назначения
регистр общего назначения general-purpose register Регистр в микропроцессоре, хранящий в себе промежуточные числовые данные в расчетах, и иногда - адреса памяти.
сегментный регистр segment register Регистр в микропроцессоре семейства x86, хранящий в себе "старшую" часть адреса оперативной памяти (в микропроцессоре 80386 - селектор таблицы памяти). Сегментные регистры участвуют только в адресации памяти и пересылки данных.
регистр флагов flags register Регистр в микропроцессоре, содержащий признаки результатов выполнения операций с данными в этом микропроцессоре.
признак результатов sign of results Некоторое событие, условие, возникающее в результате выполнения операций с данными. Например, признаком может быть равенство нулю результата операции, смена знака результата, переполнение и т.п. Признаки результата используются операторами условия.
размер регистра dimension of a register Количество битов (разрядность) регистров в микропроцессоре.
разрядность регистра width (capacity) of the register См. размер регистров. Разрядность регистров обычно кратно байту (8 бит).
старший бит (числа) old bit (of a number) Самый "левый", расположенный в начале ячейки памяти бит.
целые числа integer Целые числа в "математическом" смысле, представленные в ЭВМ в двоичном виде, в виде последовательности нулей и единиц. Различают типы целые со знаком и целые без знака. Целые числа имеют длину от одного байта до одного двойного слова.
натуральный ряд чисел natural number sequence Обычные числа, используемые при счете людьми (например, "на пальцах"). Натуральный ряд начинается с единицы и продолжается сколь угодно больше (до "бесконечности").
целые без знака unsigned integer Представляют практически "натуральный ряд" чисел (в математическом понимании), записанный в двоичном формате и начинающийся не с "1", а с нуля. Старший бит этого типа является двоичным разрядом.
целые со знаком signed integer Представляет собой тип "целых чисел", представленных в двоичной форме. Старший бит этого типа - знак числа ("1"), а сами отрицательные числа представлены в "дополнительном коде".
признак знака sign attribute Самый старший (левый) бит в регистре или ячейке памяти. Если он установлен (его значение - "1"), то число в регистре - отрицательное. Если же он сброшен (его значение - "0"), то число в регистре положительное.
старшинство бит precedence of the bits Расположение бит в регистре или ячейке памяти в возрастающем порядке по номерам бит. Нумерация идет справа налево, начиная с самого младшего, нулевого, разряда двоичного числа.
установка бита set of the bit Назначение биту в ячейке памяти значения, равного единице.
сброс бита cleaning the bit Назначение биту в ячейке памяти значения, равного нулю.
целочисленный регистр integer register Регистр в микропроцессоре, в котором хранятся двоичные целые числа разрядностью в два, четыре или восемь байт. Операции разработки интерфейса и манипулирование символьными данными происходят как раз с использованием целочисленных регистров.
программный интерфейс приложения API Встроенный в приложение интерфейс (который может быть встроенным языком программирования или библиотекой с функциями для работы с приложением), позволяющий пользователю расширить количество функций (или, по-другому, повысить функциональность) базового приложения. К API относятся языки программирования VBA, VBScript, JScript, ME Script и другие языки программирования.
Windows API Windows API Библиотека стандартных функций для языков программирования, позволяющая создавать приложения Windows на стандартном языке программирования. В отличие от других библиотек, библиотека Windows API работает на "нижнем" уровне программирования, поэтому созданные с ее помощью программы имеют очень "объемный" код.
целочисленная арифметика integer arithmetic Арифметические операции, определенные на множестве целых чисел. Результатом целочисленной арифметики являются только целые значения. Поэтому операция деления в ней работает не вполне корректно, а многие функции (например, извлечение корня) в целочисленной арифметике не определены.
смена знака числа sign of a number replacement Изменение знака ("префикса") числа с "плюса" на "минус" и наоборот. При этом положительное число становится отрицательным и наоборот.
инкремент (числа) increment (of a number) Увеличение значения числа на единицу.
декремент decrement Уменьшение значения числа на единицу.
операция отношения operation of relation Операции с числами и символьными данными, типа: "больше", "меньше", "равно", "не равно", - возвращаемые логические значения: "Истина" или "Ложь". Операции равенства - неравенства не работают в арифметике с плавающей точкой.
особые ситуации critical conditions См. исключительные ситуации
исключительные ситуации exceptions Ситуации при работе с целыми и вещественными типами, вызывающие прерывание (отказ) системы, и невозможность выполнения дальнейших расчетов по программе. При обработке исключительных ситуаций можно предусмотреть вмешательство оператора ЭВМ.
признаки операций attribute of the operations См. признаки результатов и исключительные ситуации. Признаки операций записываются в регистры флагов, откуда считываются операторами условия.
переполнение 1. overflow 1. Прерывание (программная ошибка), возникающее в случае превышения результатом арифметической операции верхнего или нижнего (отрицательного) предела числа. Эта ошибка является ошибкой выполнения программы.
переполнение 2. overflow 2. Попытка записать в регистр или ячейку памяти целое число с разрядностью, превышающей разрядность этого регистра или ячейки памяти.
деление на ноль divide by zero Прерывание (программная ошибка), возникающая в случае арифметического деления на ноль. Эта ошибка является ошибкой выполнения программы.
исчезновение знака missing of the sign Прерывание (программная ошибка), означающая, что в старший бит регистра (то есть признак знака) был перенос единицы из следующего за ним разряда (бита). Соответствует прерыванию "переполнение" (2), но для целых чисел со знаком.
ошибка выполнения run-time error Ошибка, возникающая не на этапе разработки программы, а в процессе "тестового прогона" написанной программы. Заметим, что ошибка выполнения - это не всегда ошибка алгоритма, но всегда - ошибка разработчика!
прерывание interruption Временное или "постоянное" приостановление работы программы в случае нештатной ситуации (ошибки в программе, запроса на ввод данных и т.п.).
целочисленное деление integer division Операция деления, осуществленная на множестве целых чисел. В отличие от "арифметического" деления при целочисленном делении дробная часть отбрасывается.
булева алгебра Boolean algebra Раздел математики, изучающий операции с логическими данными, то есть данными, принимающие значения: "истина" и "ложь" ("true" и "false").
булевы данные Boolean См. логические данные
логические данные logical data Переменные, принимающие значения: "Истина" ("true") и "Ложь" ("false"). Принято обозначать значение: 'false' = 0, а 'true' = 1 или 'true' <> 0.
логическая операция Boolean operation Операция, выполняемая в булевой алгебре над логическими данными. К логическим операциям относят: конъюнкцию, дизъюнкцию, отрицание, "исключающее ИЛИ" и др.
конъюнкция conjunction, AND Операция "логического И", "логического умножения". Осуществляет операцию над булевыми данными, как показано в таблице 05.IV
дизъюнкция disjunction, OR Операция "логического ИЛИ", "логического сложения". Осуществляет операцию над булевыми данными, как показано в таблице 05.IV
отрицание negation Операция "логического НЕ", меняющая значение следующей за ней логической переменной на противоположный (с 'true' на 'false', и наоборот).
логическое "исключающее ИЛИ" XOR Операция над логическими данными, осуществляющая действия, какие показаны в таблице 05.IV
булевы типы Boolean data types Обозначение логических данных в языках программирования.
АНИС ANSI Сокращение от аббревиатуры "Американский национальный институт стандартов". Главное учреждение по разработке стандартов в США.
ANSI C ANSI C Стандарт на язык Си, принятый в начале 90-х годов XX века. Программы, написанные с применением данного стандарта, являются кроссплатформенными (то есть могут, в принципе, работать с любой операционной системой). Все имеющиеся реализации языка Си поддерживают этот стандарт, но имеют также "дополнительные" средства, расширяющие этот стандарт.
арифметика плавающей точки floating point arithmetic "Обычная" арифметика, реализуемая на компьютере. Имеет некоторые ограничения на операции отношения.
мантисса mantissa Значащие разряды вещественного числа, записанные в виде последовательности цифр после десятичной точки. См. соответствующий раздел в учебнике.
порядок order of magnitude Степень числа - основания счисления, на которую надо умножить мантиссу, чтобы получить вещественное число.
вещественное (число) real (number) Число, представленное целой и дробной частью. В отличие от рационального числа, дробная часть вещественного числа может быть бесконечной.
основание счисления base of the notation Количество цифр, используемых при представлении чисел. Так, основание десятичной системы счисления (цифры 0-9) равно десяти, двоичной (0-1) - два и т.д.
одинарная точность float Регистр для представления вещественных чисел с плавающей точкой длиной 4 байта.
двойная точность double Регистр для представления вещественных чисел длиной 8 байт.
возведение в степень involution Операция последовательного умножения чисел на самих себя. Возведение числа x в степень y обозначается как x^y.
возведение в целую степень integer involution Возведение в степень числа x, где y - целая величина. Например: x^0 = 1, x^1 = x, x^2 = xox, x^3 = xoxox, и т.д.
алгебраические функции algebraic functions Функции для реализации операций возведения в дробную степень, логарифмирования функции, нахождение Бесселевых, сферических и др. функций, требующих вычислений по сложным алгоритмам.
переполнение порядка order overflow Прерывание, возникающее, если в результате умножения вещественных чисел порядок результата превысил свое максимальное, либо минимальное значение.
исчезновение порядка missing of the order Прерывание, возникающее при обнулении мантиссы при минимальном значении порядка.
< Лекция 4 || Лекция 5: 12 || Лекция 6 >