Итак, на предыдущей странице мы выяснили, какие бывают вещественные типы данных в паскале, а также указали границы их изменений. Ещё мы заметили, что эти границы только приблизительные. Но почему? А потому, что для указания точных границ существуют определенные константы вещественного типа, которые и указывают на точное значение границ диапазона изменения вещественных чисел. Давайте в этом разберемся.
Рассмотрим вещественный тип real с максимально возможным допустимым значением 1.8∙10308. Это число в PascalABC.Net имеет специальное обозначение – MaxReal
, и в нем хранится точное значение положительной границы вещественных чисел в паскале. Поскольку числа на компьютере хранятся в двоичном формате, то было бы уместно указанное нами число тоже перевести в двоичное представление. Но как это сделать?
Если двоичное число N записать в десятичной системе счисления, то мы получим некую сумму N = 2n1 + 2n2 + … 2nk, где n1 > n2 > … > nk – целые числа, и это разложение можно получить единственным образом. Например, число 25 можно представить как 24 + 23 + 1, 80 записывается в виде 26 + 24, а для 1024 вообще запись проста: 1024 = 210. Давайте и максимальное число MaxReal
тоже запишем в аналогичном виде.
Сначала надо найти наибольший показатель степени n1. Для этого необходимо взять логарифм числа N по основанию 2, а потом отбросить дробную часть (это в идеале). Сразу заметим, что тип real
имеет только 15 – 16 значащих цифр, но это не помешает сделать некоторую оценку. Давайте сделаем это, но только для числа MaxReal
. Для этого напишем простенькую программу в среде PascalABC.Net, которая будет искать логарифм двоичный числа MaxReal
, а потом выведет его на экран. Для вычисления логарифма числа x по основанию 2 в PascalABC.Net есть функция log2(x). В связи с этим имеем программу:
var
a: real;
begin
{ Вычисляем логарифм числа MaxReal по основанию 2: }
a := log2(MaxReal);
{ Выводим результат на экран: }
write('Результат: ', a)
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308
Запустим созданную программу и посмотрим на результат. Если всё сделали правильно, то вы должны увидеть следующее:
Результат: 1024
Как видим, число n1 оказалось целым, а это значит, что положительная граница диапазона вещественных чисел очень близка к 21024. Близка потому, что константа MaxReal
невероятно велика, поэтому отклонение от этого числа на миллионы и даже больше не повлияет на результат: мы всё равно получим 1024. В действительности результат следующий: MaxReal = 21024 – 1. Таким образом, мы и не могли получить дробный результат.
Для тех, кто пользуется простым PascalABC, то log2(MaxReal)
надо заменить на ln(MaxReal)/ln(2)
, поскольку в данной версии паскаля нет логарифмов отличных от натурального. В этом случае мы получим код:
var
a: real;
begin
{ Вычисляем логарифм числа MaxReal по основанию 2: }
a := ln(MaxReal) / ln(2);
{ Выводим результат на экран: }
write('Результат: ', a)
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308
Но запустив эту программу, вы можете увидеть примерно следующее:
Результат: 1023.91938797167
Как видно, результат уже не такой точный, поэтому будем «верить» предыдущему результату, полученному в PascalABC.Net. Это связанно с тем, что, повторюсь, паскаль вычисляет только 15 – 16 значащих цифр, а остальное округляет.
А что же с минимальным значением для чисел вещественного типа? Оно равно -21024. Таким образом, диапазон изменений вещественных чисел в паскале будет [- 21024, 21024 - 1]. Это огромные числа, которые паскаль, к сожалению, записать цифрами не может.
А теперь встает вопрос: какое значение минимального положительного числа, иными словами, каким маленьким может быть вещественное число типа real
? Насколько близко оно может приближаться к 0? Это число называется MinReal
и его значение 2-1074, то есть единица, разделенная 1074 раза на 2. Поставьте в первую программу вместо MaxReal
число MinReal
и вы убедитесь сами. Этот минимум означает, что уже меньшее число, скажем, 2-1075 паскаль уже не воспримет, и выдаст 0.
Обе рассмотренные нами вещественные константы (MaxReal
и MinReal
) относятся к типу Real
. Аналогичные величины есть и для типа double
: MaxDouble
и MinDouble
, но, как мы заметили на предыдущей странице, тип real
и double
являются синонимами, по крайней мере, на сегодняшний момент, поэтому предыдущие границы (константы) для типа double
тоже равны MaxReal
и MinReal
соответственно.
Наконец, для действительного типа Single
наибольшее и наименьшее положительные значения соответственно равны MaxSingle
= 2128 - 1 и MinSingle
= 2-149. И это пока что всё о константах вещественного типа в паскале. На следующей странице будем использовать все рассмотренные константы в программах.