Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
db_lectures / 03. Типы данных PostgreSQL.docx
Скачиваний:
47
Добавлен:
21.05.2015
Размер:
60.86 Кб
Скачать

8.1.3. Типы с плавающей точкой

Типы данных real и double precision являются неточными числовыми типами с переменной точностью. На практике, эти типы обычно реализуются по стандарту IEEE Standard 754 для Двоичной Арифметики с Плавающей Точкой (соответственно одинарной и двойной точности), согласно поддержке этих типов, процессором, операционной системой и компилятором.

Слово "неточный", применительно к этим типам означает, что некоторые значения не могут быть точно преобразованы во внутренний формат этих типов и поэтому они хранятся как приблизительные значения, так что если сохранить, а потом получить какое-либо значение, то можно увидеть незначительные отличия. Управление такими ошибками и то как они разрастаются при вычислениях — это тема целой ветки математики и компьютерной науки. Поэтому здесь это рассказываться не будет, за исключением следующих моментов:

Если требуется точное хранение и вычисление значений (таких как денежные величины), используйте вместо данных типов, тип numeric.

Если вы хотите выполнять сложные вычисления с этими типами для каких-либо важных целей, особенное если вы надеетесь на определённое поведение в граничных моментах (бесконечность, переполнение) вы должны реализовывать такие вычисления осторожно.

Сравнение двух значений с плавающей точкой на равенство может работать, а может и не работать так, как вы ожидаете.

На большистве платформ, тип real имеет диапазон как минимум от 1E-37 до 1E+37 с точностью по меньшей мере в 6 десятичных разрядов. Тип double precision обычно имеет диапазон от 1E-307 до 1E+308 с точностью по меньшей мере в 15 разрядов. Значения, которые слишком велики или слишком малы приведут к ошибке. Если точность вводимых чисел слишком велика, возможно округление. Числа слишком приближающиеся к нулю, которые не могут быть представлены как отличные от нуля приведут к ошибке переполнения.

В дополнение к обычным числовым значениям, типы с плавающей точкой имеют некоторые специальные значения:

Infinity

-Infinity

NaN

Это соответствует специальным значениям стандарта IEEE 754 для "бесконечности", "минус бесконечности" и значению "не-число" соответственно. (На машине, где арифметика с плавающей точкой не соответствует стандарту IEEE 754, эти значения, предположительно, не будут работать так, как ожидается). При записи этих значений как констант в командах SQL, вы должны заключить их в одинарные кавычки, например, UPDATE table SET x = 'Infinity'. При вводе этих строк, они распознаются независимо от регистра букв.

Note: IEEE754 указывает, что NaN не должен быть равен любым другим значениям с плавающей точкой (включая NaN). Чтобы разрешить сортировку значений с плавающей точкой и использовать индексы, основанные на деревьях, PostgreSQL считает значения NaN равными или больше, чем все не-NaN.

PostgreSQL также поддерживает стандартную нотацию float и float(p) для задания неточных числовых типов. Здесь p указывает минимально доступную точность в двоичных разрядах. PostgreSQL принимает значения от float(1) до float(24) как тип real и значения от float(25) до float(53) как double precision. Значения p выходящие за этот допустимый диапазон приведут к ошибке. Указание float без точности означает double precision.

Note: До версии PostgreSQL 7.4, точность у float(p) означала количество десятичных разрядов. Для соответствия стандарту SQL, который говорит, что точность измеряется в двоичных разрядах — это было исправлено. Для типов real и double precision в мантиссе соответственно содержится 24 и 53 бит, что соответствует стандарту IEEE на реализацию чисел с плавающей точкой. На платформах не соответствующих стандарту IEEE, количество бит может быть меньше, но для простоты, на всех платформах используется одни и те же диапазоны p.