Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Как представляются переменные вещественного типа в памяти компьютера

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

Рис. 2.7. Распределение двоичных разрядов (бит) при хранении числа типа real

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

 

Таблица 2.2. Вещественные типы данных языка Паскаль

 

Тип переменной

 

Формат (длина)
в байтах

 

Примерный диапазон
абсолютных значений

Количество значащих десятичных цифр

Одинарный (single)

4

10-45 - 1038

7 или 8

Вещественный (real)

6

10-39 - 1038

11 или 12

Двойной (double)

8

10-324 – 10308

15 или 16

Расширенный (extended)

10

10-4932 - 104932

19 или 20

 

Как совместить переменные целого и вещественного типа

В программе могут одновременно встречаться переменные разных типов. Как их совместить?

Преобразование типов

Пример 2.7.
Одновременное использование вещественных и целых типов

Program Mix;
var
N,K: integer;
А: real;
begin
N: =4;
A:=3.6;
B:=N; {В переменную типа real можно
записать целое число}
writeln("В=".В);
{В переменную типа integer нельзя записать вещественное число! Чтобы все-таки поместить число типа real в переменную типа integer, нужно явно указать, что делать с дробной частью числа. Есть два варианта; }
N:=Trunc(A);
{Функция Trunc(X) возвращает целую часть числа X, то есть отбрасывает дробную часть} writeln(‘Trunc (3.6)=’,N);
K:=Round(A); { Функция Round(X) округляет до ближайшего целого }
writeln (‘Round(3.6)=' ,К) ;
end.

 

При запуске программа выведет на экран следующее:

В:= 4.0000000000Е+00
Trunc(3.б)=3
Round(3.6)=4

 

Еще раз уточним правила преобразования типов: для хранения данных типа integer используется 2 байт, а для real необходимо 6 байт. Это значит, что число типа integer можно поместить в ячейку типа real (целая часть будет равна этому числу, а дробная будет равна нулю). А вот число типа real в ячейку типа integer никак не поместится. Чтобы все-таки поместить его туда, нужно явно указать, что делать с дробной частью числа. Для этого прёдусмотрены функции trunc и round. Обе они возвращают результат типа integer.

 

Что делать, если в программе нужно записать сложное математическое выражение? В каком порядке будут выполняться действия?

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

 

Действия над данными разных типов

Сведем воедино операции и функции по работе с вещественными и целыми величинами (табл. 2.3).

Поясним написанное в таблице. Мы разделили все функции/операции на 6 категорий:

  1. Результат операций +, - и * зависит от типа аргументов. Если хоть один из них имеет тип Real, то и результат будет иметь тип Real. Это объясняется тем, что у данных типа Real есть дробная часть, а у Integer — нет. Даже если в вещественной переменной хранится целое число, оно все равно имеет дробную часть, только она равна нулю. То есть если хотя бы у одного из аргументов есть дробная часть, то в результате выполнения операции она никуда не исчезает. Поэтому результат тоже имеет дробную часть (Real).

Таблица 2.3.Операции и функции для типов integer и real

Операция/функция

Тип данных 1 -го аргумента

Тип данных 2 -го аргумента

Тип данных результата

+,-,*

Integer
Integer
Real
Real

Integer
Real
Integer
Real

Integer
Real

/

He важен

He важен

Real

Div, mod

Только Integer

Только Integer

Integer

Abs, Sqr

Integer

Integer

 

Real

Real

Sqrt, Sin, Cos, Arctan, Ln, Exp, Pi

He важен

Real

Trunc, Round

He важен

Integer

 

2. Результат операции вещественного деления по определению всегда имеет дробную часть.
3. Операции целочисленного деления определены только для целых чисел. Поэтому результат тоже всегда целое число.
4. Функции Abs и Sqr определены для обоих типов данных. Поэтому тип их результата зависит от типа аргумента. Для целого аргумента результат имеет целый тип, для вещественного — вещественный.
5. Функции Sqrt, Sfn, Cos, Arctan, Ln, Exp, Pi по определению являются вещественными. (На самом деле это связано с особенностями вычисления Паскалем этих функций. Он вычисляет их приближенно путем разложения в ряд. Такой метод не предполагает целого результата в виде целого числа. Более того, значения этих функций всегда вычисляются приближенно.)
6. Функции Trunc и Round предназначены для преобразования типов. Они явно указывают на то, что сделать с дробной частью числа. Поэтому это единственный способ получить на Паскале из дробного числа целое. Изложенные выше сведения позволяют нам понимать, что за выражение написано в чужой программе, какое оно будет иметь значение и какого типа будет результат.

Задание 2.10.
Вычислите выражение и укажите тип результата:

Abs(12 mod 7*4/2-350 div 15)+2

 

Сначала расставим операции в соответствии с их приоритетами (табл. 2.4).

 

Таблица 2.4. Расстановка операций в примере 2.8

Операция

Пояснение

1

12 mod 7

Сначала выполняются действия в скобках. Скобки в данном случае ограничивают аргумент функции Abs. В скобках сначала выполняются операции типа «умножение-деление», а потом — «сложение-вычитание». Операции mod, и div осуществляют целочисленное деление. Их приоритет такой же, как у операций «*» и </». В первой группе таких операций три. Выполняем их слева направо. Поэтому сначала выполняем mod, затем — «*», а потом — «/»

2

(12 mod 7)* 4

 

3

(12 mod 7*4) /2

 

4

350 div 15.

Теперь выполняем вторую группу операций типа «умножение-деление». В данном случае это одинокая операция div

5

(12 mod 7*4/2) - (350 div 15)

Теперь пришла пора объединить результаты первых двух групп операцией «-». Она выполняется последней в скобках, так как имеет наименьший приоритет

6

Abs(...)

Теперь пора посчитать результат функции

7

Abs(...) + 2

Последний оператор — сложение

 

Нам представляется удобным расставлять приоритеты, обводя операции (рис. 2.8). Так оказывается легче понять, что уже вычислено и что еще предстоит вычислить.

Рис. 2.8. Порядок выполнения операций в задании 2.10.

Теперь определим тип и результаты каждого действия (табл. 2.5).

Таблица 2.5. Вычисление результатов каждого, действия из задания 2.10.

Операция

Результат и его тип

Пояснение

1

12 mod 7

5 Integer

Остаток отделения 12 на 7 равен 5. Результат операции mod всегда целый

2

5*4

20 Integer

Результат умножения двух целых — целое число

3

20/2

10.0 Real

Результат вещественного деления всегда вещественный. Хотя 20 делится нацело на 2, мы специально приписали «.0» к результату, чтобы подчеркнуть и не забыть, что результат вещественный и имеет дробную часть

4

350 div 15

23 Integer

При целочисленном делении нас интересует только целая часть частного. Результат операции div всегда целый

5

10.0-15

-5.0 Real

При вычитании одно из чисел имеет дробную часть. Команды от нее избавиться не было, поэтому результат тоже имеет дробную часть. Значит, результат имеет тип Real

6

Abs(-5.0)

5.0 Real

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

7

5.0 + 2

7.0 Real

Те же соображения, что и в 5-м пункте. Результат имеет дробную часть

Ответ: 7.0. Real

 

Задание 2.11.
Дано действительное число X. Напишите программу для вычисления:
+ целой части числа Х,
+ числа X, округленного до ближайшего целого;
+ числа X бездробных цифр.

 




 

Комментарии:

2011-01-25 ответил Николай

Очень умный курс. Где взять программное обеспечение?



2011-06-23 ответил NeT

гугли: turbo pascal 7.1



2011-07-29 ответил al

Ошибка в 5 действии. Из 10.0 вычитать надо 23. У меня эта книга есть, заметил ошибку, думал, что тут исправлено, но... По для Линукса - FreePascal, который будет консолью в терминале запускаться или кнопку можно кинуть на рабочий стол. И надо иметь Lazarus - аналог Delphi Borland. Кстати, горячие клавиши под линуксом не работают (по умолчанию), а перенастроить я не пытался.



2011-07-29 ответил al

Кстати, в последнем действии тоже ошибка: прибавляем 2, а не 4. Посмотрите на начальную формулу.



2011-07-29 ответил al

В таблице правильно, а на схеме ошибка.



2013-11-12 ответил Вадим

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



2015-02-14 ответил Мария

Кстати, этот материал из книги Д.М.Ушакова,Т.А.Юркова"Паскаль для школьников" советую приобрести!



2015-03-03 ответил Александр

Курс древний, а числа типа real занимают 8 байт, а не 6, integer - 4 байта, и вообще толком о числах и их представлениях ничего не написано, кроме как преобразовывать их.



2020-02-09 ответил амир

Почему вы говорите, что тип real занимает 6 байт, но на рисунке 2.7 я вижу всего 4 байта? 3 байта для мантиссы, 1 для значения порядка и 1 знаковый бит




Добавить свой комментарий:


Введите значение:
 









   
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru