Вещественные типы данных в Pascal
Создано: 16.04.2026
В языке Паскаль есть несколько типов для хранения действительных (вещественных) чисел. Чаще всего используется тип Real, под переменные которого выделяется по 8 байт памяти.
var a: single; b: real; c: double; d: extended; e: comp; f: currency; begin writeln(sizeof(a)); // 4 writeln(sizeof(b)); // 8 writeln(sizeof(c)); // 8 writeln(sizeof(d)); // 10 writeln(sizeof(e)); // 8 writeln(sizeof(f)); // 8 end.
В современных версиях компиляторов Паскаля тип real — это эквивалент double. Значения типа single называют числами одинарной точности, а double — двойной, поэтому у них такое название. Тип extended предполагает повышенную точность и используется в научных расчетах. Comp предназначен для хранения больших целых чисел в виде вещественных. Currency используется для финансовых расчетов. В нем жестко зафиксировано 4 знака после запятой, что помогает избежать ошибок округления, характерных для вещественных чисел.
В отличие от целых, для вещественных типов данных объем выделяемой памяти определяет не только размер их диапазона, но и предел точности значений, то есть сколько значащих цифр может быть после запятой (в программировании ее роль играет точка). Даже если число малое по своему значению, но может быть важно, чтобы после запятой правильно сохранялось большое количество цифр. В результате запись числа, которую надо сохранить, получается длинной. Кроме того, неизвестно, где находится запятая. У одних чисел она может быть в одном месте, у других — в другом. Поэтому в компьютерах вещественные числа кодируются не как есть, а кодируется их нормализованная форма. В ней все вещественные числа имеют одинаковый "стандартный вид".
Вернемся к тому, как write отображает вещественные числа по-умолчанию. Такой неформатированный вывод ближе к тому, как на самом деле действительное число хранится в памяти.
var a: single; b: real; d: extended; e: comp; f: currency; begin a := pi; writeln(a); b := pi; writeln(b); d := pi; writeln(d); e := pi; writeln(e); f := pi; writeln(f); end.
3.141592741E+00 3.1415926535897931E+000 3.14159265358979323851E+0000 3.000000000000000000E+0000 3.141600000000000000E+00
Стандартная функция pi языка Pascal возвращает максимально возможную точность для вашего компьютера значения числа π. При присваивании его переменным разных типов происходит отбрасывание "лишних" цифр или замена их нулями.
Нормализованная форма — это одна из форм экспоненциальной записи числа, когда число умножается на 10 в той или иной степени. В выводе write степень указывается после буквы E. В случае нормализованного числа перед точкой должна стоять одна значащая цифра (не ноль). Поскольку число π само по себе имеет нормализованную форму, то в его выводе после E находятся нули. Здесь не надо возводить десятку ни в какую степень.
Однако этот вывод примечателен тем, что мы видим сколько десятичных знаков отводится под мантиссу (число до E) и сколько под хранение степени десятки. В компьютерной памяти хранятся именно они: мантисса и порядок (степень). Понятно, что в двоичном представлении.
Рассмотрим пример:
var a, b: single; begin a := 0.0045; writeln(a); b := 148.32; writeln(b); end.
4.499999806E-03 1.483200073E+02
Число 0.0045 в нормализованной форме записывается как 4.5 * 10-3, для числа 148.32 это будет 1.4832 * 102. Примерно так их и выводит write. Однако мы почему-то видим приблизительное, а не точное значение. Это связано со сложностями хранения и перевода вещественных чисел в двоичную систему счисления, а также с накоплением погрешности при вычислениях.
В коде выше измените тип переменных на currency (валютный). Будут ли выведены их точные значения?
Вещественные типы в Pascal
| Тип | Диапазон | Число цифр, которым можно доверять | Память, байт |
|---|---|---|---|
| Real | 5.0e-324 .. 1.7e308 | 15-16 | 8 |
| Single | 1.5e-45 .. 3.4e38 | 7-8 | 4 |
| Double | 5.0e-324 .. 1.7e308 | 15-16 | 8 |
| Extended | 1.9E-4932 .. 1.1E4932 | 19-20 | 10 |
| Comp | -2E64+1 .. 2E63-1 | 19-20 | 8 |
| Currency | -922 337 203 685 477.5808 .. 922 337 203 685 477.5807 | 19-20 | 8 |
В таблице число цифр определяет точность, с которой будет храниться вещественное число. Так для single разрядность мантиссы может составлять не более восьми десятичных знаков. Однако при выводе вы увидите больше, так как Pascal по умолчанию выводит все данные из ячейки памяти. 8-я и 9-я цифры — это результат "шума" при переводе числа из двоичной системы в нашу десятичную.
В Паскале есть функция int, которая возвращает целую часть числа, и frac, которая возвращает дробную часть числа (то, что после запятой). Параметром для этих функций не обязательно должно являться вещественное число, может быть и целое. Однако обе они возвращают вещественный тип данных.
var x: single; begin x := 4.5389; writeln(x); writeln(int(x)); writeln(frac(x)); writeln(x:7:4); writeln(int(x):7:4); writeln(frac(x):7:4); end.
4.538899899E+00 4.00000000000000000000E+0000 5.38899898529052734375E-0001 4.5389 4.0000 0.5389
Если все же надо вещественное число преобразовать к целому, то используются функции trunc и round, которые возвращают результат целого типа. Первая отсекает дробную часть от аргумента, а вторая выполняет округление до ближайшего целого.
Вещественные числа не относятся к последовательностям. Например, мы можем сказать, какое целое предшествует числу 5, а какое — следует за ним, но не можем однозначно сказать, что за число будет за 5.00. Это может быть и 5.01, и 5.10, 6.00. Компьютер не занимается гаданием. Поэтому переменные и константы вещественного типа нельзя использовать в функциях pred, succ, в качестве индексов массивов и похожих случаях.
Задания для дополнительной или самостоятельной работы:
- Результат какого типа даст сложении вещественного числа и целого? Можно ли его присвоить целочисленной переменной? Что при этом произойдет? Как следует поступить, если надо вещественное число присвоить целочисленной переменной?
- Как округлить вещественное число с шестью значащими цифрами после запятой до такого же вещественного числа, но с меньшим количеством цифр?