Root /ArchiveAbout
()

Константы вещественного типа в Паскале

Константы вещественного типа в Паскале

Итак, на предыдущей странице мы выяснили, какие бывают вещественные типы данных в паскале, а также указали границы их изменений. Ещё мы заметили, что эти границы только приблизительные. Но почему? А потому, что для указания точных границ существуют определенные константы вещественного типа, которые и указывают на точное значение границ диапазона изменения вещественных чисел. Давайте в этом разберемся.

Рассмотрим вещественный тип 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. И это пока что всё о константах вещественного типа в паскале. На следующей странице будем использовать все рассмотренные константы в программах.