Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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 категорий:
- Результат операций +, - и * зависит от типа аргументов. Если хоть один из них имеет тип 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 знаковый бит
Добавить свой комментарий:
|
|
|