Представление вещественных чисел 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Представление вещественных чисел



До 1980-х годов разные производители вычислительной техники использовали разные форматы хранения вещественных чисел в памяти компьютера. Все они базировались на выделении значащей части числа (мантиссы) и порядка, и при этом немного отличались друг от друга.

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

В математике экспоненциальная форма записи чисел в любой системе счисления выглядит так:

А = m × q p,

где m – мантисса числа, p – порядок, q – основание системы счисления.

В такой форме представление числа неоднозначно. Рассмотрим в качестве примера число 17.25:

17.25 = 1.725 × 101 = 0.1725 × 102=…=172.5 × 10-1 = 1725 × 10-2=…

Если сдвигать десятичную точку вправо или влево и при этом изменять степень числа 10 (это и есть порядок), то значение числа не меняется.

Представим это же число 17.25 в двоичной системе счисления, для этого переведём отдельно целую и дробную части. Получим 10001.01. В двоичной системе счисления также можно сдвигать десятичную точку, не изменяя значения числа:

10001.01=10001.01 × 20=1000.101 × 21=…=0.1000101 × 25=…

Порядок определяет положение десятичной точки в числе.

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

Вещественные числа могут занимать в памяти 4, 8 или 10 байт.

При 4-байтовом представлении (32 бита) 1 бит – знак мантиссы, 8 бит отводится под порядок: оставшиеся 23бита выделяется под мантиссу.

±

Смещенный порядок

Мантисса

                                           
                                           

 

В 1985 г. был разработан международный стандарт IEEE (Institute of Electrical and Electronics Engineers) представления действительных чисел в памяти компьютера, целью которого было не только дать возможность переносить данные с одного компьютера на другой, но и обеспечить разработчиков аппаратного обеспечения правильной моделью. В настоящее время большинство процессоров поддерживают этот стандарт. Полное название стандарта ассоциации IEEE: IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985, 2008) – стандарт IEEE для двоичной арифметики с плавающей точкой.

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

1 ≤ | z | < q

Эта форма представления будет нормализованной. В двоичной системе счисления условие для нормализации , где z – значащая часть числа.

Стандарт определяет три формата хранения чисел с плавающей точкой: с одинарной точностью (32 бита), с двойной (64 бита) и повышенной точностью.

Рассмотрим, как хранится вещественное число в 4-байтовом формате по стандарту IEEE. Здесь зафиксированы три группы разрядов. Первый разряд хранит знак числа. За ним следуют 8 разрядов, определяющих порядок. В оставшихся 23 разрядах располагается мантисса числа.

Возьмем то же самое десятичное число 17.25:

17. 2510 = 10001. 012.

Чтобы представить это число в нормализованном виде, надо передвинуть десятичную точку на четыре разряда влево:

10001. 01 × 20= 1. 000101 × 24.

Любое число, нормализованное по этому правилу, имеет в двоичной системе счисления целую часть, равную единице. Поскольку у каждого числа будет одинаковая целая часть, её не хранят. Она не занимает разряд ячейки памяти и считается неявно присутствующей. Эта так называемая скрытая единица не хранится в ОЗУ, что позволяет использовать еще один дополнительный разряд значащей части. Для нашего числа – значащая часть 1. 000101. Тогда мантисса числа (без 1 в целой части):

m = z – 1 = 0. 00010100….0.

В нашем случае число положительное, поэтому знаковый разряд надо установить в 0.

Далее 8 разрядов занимает порядок. Вместо истинного порядка 4 хранится число, называемое смещенным порядком (смещенной экспонентой) или характеристикой. Смещение используется для более удобного хранения и выполнения арифметических действий с числами, которые могут иметь положительные и отрицательные порядки. Под порядок отводится 8 битов, которые позволяют хранить 256 разных значений. Порядок может быть и положительным, и отрицательным (от -127 до 127). Чтобы характеристика (смещенный порядок) была только положительной, к истинному порядку прибавляют 127. Поэтому смещенный порядок определяется выражением Х= 127 + р (p – реальный порядок). Это позволяет избежать хранения отрицательного порядка.

В нашем примере

Х = 12710 + 410= 13110 = 1 000 00112 .

Тогда наше число 17.25 в 4-байтовом формате будет иметь следующий вид:

0 10000011 00010000000000000000000

±

Смещенный порядок

Мантисса

0 1 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 ... 0 0 0
                                           

Число -17.25 в 4-байтовом формате будет иметь 1 в знаковом разряде:

±

Смещенный порядок

Мантисса

1 1 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 ... 0 0 0
                                           

Из этого следует, что если значащая часть числа в двоичном виде имеет более 24 цифр (23 разряда + 1 по умолчанию), то в 4-байтовом формате оно будет представляться в памяти приближенно (оставшиеся цифры не помещаются в отведенные разряды памяти). В десятичном виде это 7-8 значащих цифр. Вспомним, что многие числа с дробной частью, представимые точно в десятичной системе счисления, в двоичной системе счисления имеют вид бесконечной периодической дроби, например 0.210 = 0.(0011)2. Такие числа приходится ограничивать до выделенного числа разрядов. Они представляются в компьютере не точно, а с погрешностью, вызванной усечением.

Точность представления чисел зависит от размера ячейки, выделенной для хранения мантиссы. Чем больше разрядов отводится под запись мантиссы, тем выше точность представления числа.

Чем больше разрядов занимает порядок, тем шире диапазон представления чисел в компьютере при заданном формате. С помощью 4-байтового формата можно представить числа в диапазоне приблизительно (2-126 - 2+127).

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

8-байтовый формат позволяет хранить числа с большей точностью и в большем диапазоне. Но и в этом формате далеко не все числа представляются точно. В нём первый бит – знак мантиссы, 11 бит – характеристика и 52 бита – мантисса. С помощью этого формата можно представлять числа в диапазоне приблизительно ±(2-1022 - 2+1023).

10-байтовый формат имеет такое представление: первый бит – знак мантиссы, 16 бит – характеристика и 63 бита – мантисса. С помощью этого формата можно представлять числа в диапазоне приблизительно ±(2-16382 - 2+16383).

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

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

Продолжение про типы

Логический тип в стандарте С90 отсутствует. В качестве логических значений используются числа. Любое отличное от 0 число соответствует истине, а 0 – ложь. Начиная с С99, вводится тип bool. На самом деле эта переменная является целым числом. 1 или любое другое число соответствует истине, 0 – ложь.

В Си символьный тип char является разновидностью int. Этот тип позволяет работать и с числовыми данными, и с символьными. Все действия с числовыми данными в этом типе производятся в типе int (int)char.

Символьные данные задаются в кодах и представляют собой целочисленные значения. Для хранения кодов символов в языке Си используется тип char.

char с = ' R '; - 1 байт, используется для хранения символов, однако формально является целочисленным, т.к. каждый символ имеет свой числовой код, значение которого и хранится в ячейке. Символ R имеет код 82.

int x, y, z; – 2 байта или 4 байта, в зависимости от компилятора. (Диапазон допустимых значений для 2 байтовых целых будет -32768.. 32767, для 4 байт от -2147483648 до 2147483647

float а lfa; - 4 байта, +- 3.4*10-38.. 3.4*1038 . Вещественное число одинарной точности.

double beta; - 8 байт, 1.7*10-308.. 1.7*10308. Вещественное число двойной точности.

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

 

Инициализация переменных.

Переменной может быть присвоено начальное значение при объявлении:

<тип> <имя пер.>=<начальное значение>;

Int a=10, n=20;

Лекция 4

Выражения

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

или

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

Любое выражение, заканчивающееся точкой с запятой, рассматривается как оператор, выполнение которого заключается в вычислении этого выражения. Частным случаем выражения является пустой оператор; (точка с запятой)

Оператор - это наименьшая исполняемая единица программы. Для обозначения конца оператора в языке Си используется точка с запятой.

Объекты, над которыми производится действие, называются операндами. Действия над операндами это операции.

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

Знак операции — это один символ или комбинация символов, определяющих арифметические, логические или другие действия над операндами.

Каждое выражение принимает какое-либо значение. Тип результата в выражении определяется операциями и типом операндов, которые входят в выражение.

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

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

В языке Си различают одиночное присваивание, оптимизированная форма присваивания и множественное присваивание.

Для каждой операции определено количество операндов. В зависимости от этого операции делятся на унарные, бинарные и тернарные ( условная).

Например:

-5     унарная (один операнд:);

2+х    бинарная (два операнда);

?: тернарная (три операнда).

Это условная операция, например: x = 10; x>9? 100: 200;

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

Все операции в языке СИ имеют приоритет и направление выполнения.

Операции 1 ранга имеют наивысший приоритет выполнения. Операции одного ранга имеют одинаковый приоритет, и если их в выражении несколько, то они выполняются в соответствии с правилами ассоциативности либо слева на право, либо справа налево.

Например,

x = y = z =5;

y = x -10+5;

Каждая бинарная операция имеет определенный порядок выполнения: слева направо или слева направо. Например, если есть несколько сложений, то они выполняется слева направо, а присваивание справа налево.

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

Выражение может содержать несколько операций одного приоритета. Когда несколько операций одного и того же уровня приоритета появляются в выражении, то они применяются в соответствии с их ассоциативностью — либо справа налево, либо слева направо.

В общем случае, унарные операции, условная операция и операции присваивания правоассоциативны, а остальные операции левоассоциативны: выражение x = y = z; означает x = (y = z); а выражение x+ y –z; означает (x + y) – z.

Арифметические операции: +, -, *, /, %, ++, --;

Арифметические операции ассоциируются слева направо.

a+b -c

Приоритет: ++, --, одноместный + или -; *, /, %,+, -,

Язык С предоставляет пользователю операции ++ (инкремент) и -- (декремент). Они увеличивают или уменьшают значение переменной на 1.

Например,

x++; //это означает, x=x+1;

или

x--; // это означает, x=x-1;

Они могут следовать до операнда ++ x (префиксная форма) или после x ++ (постфиксная форма).

Префиксная и постфиксная формы отличаются при использовании их в выражениях.

Если оператор инкремента или декремента предшествует операнду, то сама операция выполняется до использования результата в выражении. Если же оператор следует за операндом, то в выражении значение операнда используется до выполнения операции инкремента или декремента.

++ x в выражении означает, что сначала a увеличивается на 1, и ее новое значение будет использоваться в выражении.

x ++ в выражении означает, что сначала a используется в выражении, а затем ее значение увеличивается на 1.

Выражение x=x+1, можно записать как в виде ++x;так и в виде x++;

Значения x будут увеличены на 1 всегда, но использование их в выражениях разное.

Например,

  y =2; x = ++ y +5; Сначала при вычислении выражения y увеличится на 1 (y=y+1), станет равным 3 (y =3); затем, будет выполнено действие 3+5, результат 8 будет записан в переменную x. Значение выражения будет 8. Это равносильно: y =2; у=у+1; x = y +5; А если выражение записать в виде: y =2;  x = y ++ +5; то сначала при вычислении выражения к у будет прибавлено 5 (2+5=7) и это значение будет записано в переменную x (x =7). И только, когда выражение будет вычислено, y увеличится на 1, станет=3.Это равносильно y =2; x = y +5; у=у+1;

Префиксная форма переменной в выражении обладает самым высоким приоритетом среди всех арифметических операций.

Постфиксная форма переменной в выражении обладает самым низким приоритетом, ниже присваивания.

Операция деления / применяется к операндам числового типа.

При делении целого на целое результатом будет целая часть от деления. Например,  3/2 результат 1, 2/3 – 0.

При делении если хотя бы один операнд вещественный, то результат будет вещественный. Например,

int a=5;

double b=2, c;

c=a/b; (2.5)

c=5./2; или с=5/2.; результат тоже вещественный.

Операция % применяется к операндам целого типа и означает остаток от целочисленного деления.

Например,

2%3 результат 2;            5%2 результат 1;

Операции отношения (сравнения): >, <, <=, >=,!=, ==;

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

Логические операции:!, &&, ||

Результатом логического выражения или выражения отношения в Си является целочисленное значение 0 – ложь, или любо е целое число (ненулевая величина) – истина. Обычно это 1.

2>3 результат 0, т.е. ложь;

2==2 результат 1, т.е. истина;

x=2; x>0<1 результат 0

x =2; x >0==1 результат 1

В стандартах С89 и в С99 значение ИСТИНА представлено любым отличным от нуля числом, а ЛОЖЬ — нулем. В стандарте С99 дополнительно определен тип данных _ b ооl, переменные которого могут принимать значение только 0 или 1.

Приоритет операций отношения и логических операций:

!

  > >= < <=

    ==!=

&&

||

Присваивание

В языке Си операция присваивания записывается знаком (=). В этой операции действие выполняется справа налево.

Оператор присваивания может присутствовать в любом выражении языка Си. Этим Си отличается от большинства других языков программирования (Pascal, FORTRAN), в которых присваивание возможно только в отдельном операторе.

Общая форма оператора присваивания:

имя_переменной = выражение;

В языке Си различают: одиночное присваивание, оптимизированное присваивание, и множественное присваивание.

В языке Си существуют следующие операции присваивания: =, +=, -=, *=, /=, %=;

x=5 – одиночное присваивание.

y=(x=5)+b;

1) x=5   2)y= x+b

Можно записать многократное (множественное) присваивание: a = b = c = x * y. Сначала вычисляется x*y, затем это значение присваивается c, затем b и a.

Для выражений вида: n=n+2; n=n*2; n=n/2; n=n%2 существует другая форма записи (компактная или оптимизированная форма).

n=n+2; n+=2;

n=n*2; n*=2;

n=n/2;   n/=2;

n = n %2; n %=2;   //остаток от деления, только для целых

Или выражение x=x*(y+1) эквивалентно x*=y+1;



Поделиться:


Последнее изменение этой страницы: 2020-11-23; просмотров: 1126; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.128.129 (0.068 с.)