DECFLOAT - тип данных будущего

Новый тип данных десятичных чисел с плавающей запятой в DB2 для Linux, UNIX и Windows

В данной статье рассматривается новый тип данных DECFLOAT в IBM® DB2® для Linux®, UNIX® и Windows®. DECFLOAT совместим с промышленным стандартом - спецификацией IEEE754r. Используя аппаратную поддержку, DECFLOAT предоставляет приложениям преимущества в производительности по сравнению с использованием данных типа DECIMAL..

Нареш Чейнани, разработчик программного обеспечения, IBM

Нареш Чейнани (Naresh Chainani) - разработчик программного обеспечения. Последние шесть лет разрабатывал DB2 для Linux, UNIX и Windows в IBM Beaverton. Начинал свою деятельность в группе разработки DB2-компилятора, а затем занимался разработкой механизма времени исполнения DB2. Хорошо знает SQL и понимает важность и преимущества согласованности с промышленными стандартами. Был техническим руководителем проекта DECFLOAT в DB2.



22.12.2008

Введение

Вы уверены, что ваше предприятие никогда не теряло деньги из-за ошибок округления? Вы уверены в точности результатов, выдаваемых вашими бизнес-приложениями? Хотели ли вы когда-нибудь иметь приложение, перемалывающее цифры быстрее? Выходят ли ваши затраты на разработку приложений из-под контроля по причине семантической несовместимости типов данных разных языков, платформ и производителей?

Для решения всех этих проблем DB2 для Linux, UNIX и Windows предлагает DECFLOAT, новый тип данных десятичных чисел с плавающей запятой, основанный на стандарте IEEE754r. DECFLOAT обеспечивает наивысшую точность и диапазон значений для десятичной арифметики в DB2 и поддерживает пять режимов округления. DECFLOAT показывает отличную производительность, используя преимущества аппаратной поддержки в системах, основанных на процессорах IBM POWER6™. Благодаря встроенной аппаратной поддержке и поддержке в языке, все арифметические операции, операции преобразования и округления выполняются в формате десятичных чисел с плавающей запятой. Используя подобную поддержку этого стандартного типа данных, приложения, выполняющие бизнес-вычисления, могут получить существенный прирост в производительности. Поскольку формат десятичных чисел с плавающей запятой является развивающимся стандартом баз данных, языков и аппаратуры, стоимость разработки приложений значительно уменьшается.

DECFLOAT использует преимущества аппаратной поддержки на системах, основанных на процессорах POWER6, и полагается на программную эмуляцию на других платформах. Развиваются различные спецификации, имеющие в своей основе спецификацию IEEE754r. Вот некоторые из них:

  • C (ISO/IEC JTC1/SC22/WG14 - язык программирования C)
  • C++ (ISO/IEC JTC1/SC22/WG21 - язык программирования C++)
  • JAVA (Java™ Specification Request 13 Decimal Arithmetic Enhancement for Java)
  • SQL
  • XML ("Тип precisionDecimal в XML schema 1.1, часть 2: Типы данных")

Более свежая информация по этим языкам приведена на странице General Decimal Arithmetic (EN), которая содержит много информации по десятичным числам с плавающей запятой, включая состояние различных спецификаций, продуктов, языков и реализаций программного обеспечения для операций с типами IEEE754r.


О типе DECFLOAT

В зависимости от того, являетесь ли вы независимым производителем программного обеспечения (Independent Software Vendor - ISV), служащим банка или разработчиком приложений, вы найдете свои преимущества в использовании типа данных DECFLOAT.

DECFLOAT для ISV

Болевая точка ISV - необходимость писать сложную логику для работы с проприетарными типами десятичных чисел, предлагаемыми различными производителями баз данных. Это приводит к большим затратам на разработку.

Для снижения этих затрат ISV могут разработать код, основанный на стандарте арифметики с плавающей запятой IEEE754r, для того чтобы приложение могло легко взаимодействовать с различными базами данных, реализующими стандарт.

Кроме того, интенсивные вычислительные рабочие нагрузки выполняются быстрее на аппаратных реализациях арифметики с плавающей запятой.

DECFLOAT для бизнес-приложений

Болевая точка бизнес-приложений - десятичная арифметика в программном обеспечении замедляет интенсивные числовые вычисления, что сказывается на эффективности бизнес-деятельности.

Бизнес-приложения (особенно имеющие отношение к процессам на фондовой бирже и в банках) могут получить выгоду от улучшенной производительности, предлагаемой типом данных DECFLOAT, поддерживаемым аппаратно.

В бизнес-приложениях DB2 предлагает возможность выбора режима округления в базе данных. Например, вычисления налогов и процентов можно выполнять внутри базы данных.

DECFLOAT для разработчика приложений

Болевая точка разработчиков приложений - C и C++ не имеют встроенной поддержки десятичного типа данных. Положение дел еще больше ухудшается из-за того, что каждый производитель системы управления реляционными базами данных (RDBMS) предоставляет проприетарную реализацию типа данных DECIMAL, имеющую семантику, отличную от типа данных DB2 DECIMAL. Это приводит к высокой стоимости разработки приложений, связанной с необходимостью разрешения этих противоречий.

Следовательно, важно чтобы тип данных десятичных чисел с плавающей запятой специфицировался различными языками программирования, особенно C, C++ и Java. Сложные прикладные интегрированные среды, написанные на различных языках программирования, видят десятичное число с плавающей запятой как конкретный числовой тип данных.

Унифицированное представление типа данных производителями, платформами и языками уменьшает стоимость разработки, поскольку приложение не должно учитывать расхождения и нюансы каждой реализации.

Представьте себе Java-приложение, которое работает поверх интерфейса Call Level Interface (CLI) или Java database connectivity (JDBC), которые, в свою очередь, общаются с DB2 для IBM z/OS® и DB2 для Linux, UNIX и Windows, а последняя выполняется на процессоре POWER6 (см. рисунок 1).

Рисунок 1. Java-приложение, выполняющееся поверх CLI или JDBC
Рисунок 1. Java-приложение, выполняющееся поверх CLI или JDBC

Все уровни в этом примере могут использовать общий стандарт типа данных для десятичных чисел с плавающей запятой с целью устранения различий в округлении и других проблем, специфичных для типа данных.


Изменение существующих столбцов

Наиболее часто команда ALTER применяется в бизнес-приложениях, которые надо перевести с DECIMAL на DECFLOAT - промышленный стандарт типа данных, обеспечивающий отличную производительность, благодаря его аппаратной поддержке.

На какой уровень точности DECFLOAT следует изменять столбцы (ALTER)?

Поддерживаются два значения для указания точности DECFLOAT - DECFLOAT(16) и DECFLOAT(34), которые означают соответственно 16 и 34 значащие цифры и занимают 8 и 16 байт памяти соответственно. При определении того, на какую точность DECFLOAT переходить, вы должны учесть требования к точности и занимаемому пространству.

Совет. Если ваше приложение выполняет много операций агрегации, например, SUM или AVG, тогда DECFLOAT(34) может обеспечить лучшую производительность, чем DECFLOAT(16). Причина в том, что эти операции с DECFLOAT(16) переводят входное значение в DECFLOAT(34) и возвращают результаты в DECFLOAT(34) (см. пример 1):

Пример 1. Изменение столбца salary с DECIMAL на DECFLOAT(34)
Таблица зарплат сотрудников имеет столбец с типом DECIMAL(18, 2)
employee (id INT, salary DECIMAL(18,2))
ALTER TABLE employee ALTER COLUMN salary SET DATA TYPE DECFLOAT(34)

В таблице 1 приведен диапазон значений DECFLOAT:

Таблица 1. Диапазон значений DECFLOAT
Точность
(знаков)
Длина
(байтов)
Диапазон
16 8 -9.999999999999999 x 10384 to -1.0 x 10-383 :
1.0 x 10-383 to 9.999999999999999 x 10384
34 16 -9.999999999999999999999999999999999 x 106144 to -1.0 x 10-6143 :
1.0 x 10-6143 to
9.999999999999999999999999999999999 x 106144

Режимы округления

Округление происходит, когда точность результата выражения больше точности, поддерживаемой типом данных. DECFLOAT поддерживает все режимы округления, которые требуются в большинстве приложений. Эти режимы полностью совместимы со стандартом IEEE и, следовательно, поддерживаются также на большинстве аппаратных реализаций.

Поддерживаются следующие режимы округления (примеры этих режимов округления приведены в таблице 2):

  • ROUND_CEILING. Округление сверху. Если все отбрасываемые цифры равны нулю или знак числа отрицателен, последняя неотбрасываемая цифра не меняется. В противном случае последняя неотбрасываемая цифра инкрементируется на единицу (округляется в большую сторону).
  • ROUND_FLOOR. Округление снизу. Если все отбрасываемые цифры равны нулю или знак положителен, последняя неотбрасываемая цифра не меняется. В противном случае (знак отрицателен) последняя неотбрасываемая цифра инкрементируется на единицу.
  • ROUND_HALF_UP. Округление к ближайшему значению. Если результат равноудаленный, выполняется округление в большую сторону. Если отбрасываемые значения больше чем или равны половине (0,5) единицы в следующей левой позиции, последняя неотбрасываемая цифра инкрементируется на единицу (округляется в большую сторону). В противном случае отбрасываемые значения игнорируются.
  • ROUND_HALF_EVEN.Округление к ближайшему значению. Если результат равноудаленный, выполняется округление так, чтобы последняя цифра была четной. Если отбрасываемые значения больше половины (0,5) единицы в следующей левой позиции, последняя неотбрасываемая цифра инкрементируется на единицу (округляется в большую сторону). Если они меньше половины, результат не корректируется (то есть отбрасываемые знаки игнорируются). В противном случае, когда отбрасываемые значения точно равны половине, последняя неотбрасываемая цифра не меняется, если она является четной и инкрементируется на единицу (округляется в большую сторону) в противном случае (чтобы получить четную цифру). Этот режим округления называется также банковским округлением и дает ощущение справедливого округления. Он является режимом по умолчанию в DB2, согласно спецификации IEEE.
  • ROUND_DOWN. Округление по направлению к нулю (усечение). Отбрасываемые значения игнорируются.
Таблица 2. Режимы округления
Режим округления12.34112.34512.34912.355-12.345
ROUND_CEILING 12.35 12.35 12.35 12.36 -12.34
ROUND_FLOOR 12.34 12.34 12.34 12.35 -12.35
ROUND_HALF_UP 12.34 12.35 12.35 12.36 -12.35
ROUND_HALF_EVEN 12.34 12.34 12.35 12.36 -12.34
ROUND_DOWN 12.34 12.34 12.34 12.35 -12.34

Режим округления может быть изменен при помощи конфигурационного параметра базы данных decflt_rounding. . Для того чтобы изменение вступило в силу, необходимо деактивировать базу данных (см. пример 2).

Пример 2. Изменение конфигурационного параметра базы данных
Налоговая система США использует режим округления ROUND_HALF_UP. Приложение,
рассчитывающее налоги, должно изменить режим округления с ROUND_HALF_EVEN
(по умолчанию) на ROUND_HALF_UP:

db2 connect to taxdb;
db2 update db cfg using decflt_rounding ROUND_HALF_UP;
db2 connect reset;
db2 deactivate db taxdb;
-- с этого момента новые подключения будут использовать режим округления ROUND_HALF_UP 
db2 connect to taxdb;

Семантики сравнения

Замыкающие нули в значениях десятичных чисел с плавающей запятой сохраняются. Например, 1.0 и 1.00 - это два различных представления. Это порождает две семантики сравнения для типа данных DECFLOAT, как показано ниже.

  • Сравнение числовых значений. Замыкающие нули игнорируются в сравнениях. Например, 1.0 равно 1.00. По умолчанию такой тип сравнения используется для индексирования, сортировки, разбивки таблицы, оценки предикатов и других функций - короче говоря, везде, где сравнение выполняется неявно или в предикатах (см. пример 3).
    Пример 3. Сравнение числовых значений
    create table stockPrice (stock DECFLOAT(16));
    insert into stockPrice values (4.2), (4.2000), (4.6125), (4.20);
    
    select * from stockPrice where stock = 4.2;
    Возвращает три значения 4.2, 4.2000, 4.20
    
    select * from stockPrice where stock > 4.20;
    Возвращает одно значение 4.6125
    
    select * from stockPrice order by stock;
    Возвращает все значения, 4.2, 4.2000, 4.20, 4.6125. Первые три значения возвращаются
    в неопределенном порядке.
  • Сравнение TotalOrder. Замыкающие нули учитываются при сравнении. Например, 1.0 > 1.00. Каждое значение DECFLOAT имеет порядок в семантике сравнения TotalOrder.

    Согласно семантике TotalOrder, порядок различных значений определяется так, как показано в следующем примере:
    -NAN < -SNAN < -INFINITY < -0.10 < -0.100 < -0 < 0 < 
    0.100 < 0.10 < INFINITY < SNAN < NAN

    Обратите внимание на то, что отрицательный нуль меньше положительного нуля при сравнении TotalOrder.

    Запросить сравнение TotalOrder в предикатах можно при помощи встроенной функции TOTALORDER() (см. пример 4).

    Пример 4. Сравнение TotalOrder
    Для курсов акций может быть важным знать точность данных. Например, 
    если курсы обычно указываются с точностью в пять знаков после запятой,
    а курс равен $4.2, тогда неясно, равна цена $4.2000, $4.2999 или 
    чему-то, лежащему между этими двумя значениями.
    
    create table stockPrice (stock DECFLOAT(16));
    insert into stockPrice values (4.2), (4.2000), (4.6125), (4.20);
    
    select * from stockPrice where TOTALORDER(stock, 4.2000) = 0;
    Возвращает только значение 4.2000 
    
    select * from stockPrice where TOTALORDER(stock, 4.20) = 1;
    Возвращает два значения 4.2 и 4.6125, которое больше 4.20

    Порядок, в котором возвращаются арифметически одинаковые значения, имеющие различное количество замыкающих нулей, не определен. Следовательно, ORDER BY по столбцу DECFLOAT со значениями 1.0 и 1.00 возвращает два значения в произвольном порядке. Аналогично, DISTINCT возвращает либо 1.0, либо 1.00.


Встроенные функции

Для поддержки типа данных DECFLOAT добавлены следующие новые встроенные функции:

  • TOTALORDER(expr1, expr2). Сравнивает expr1 с expr2 согласно семантике TotalOrder спецификации IEEE и возвращает значение типа SMALLINT, равное -1, 0 или 1 и указывающее, что expr1 меньше чем, равно или больше чем expr2.
  • NORMALIZE_DECFLOAT (expr). Нормализует входной аргумент expr путем удаления избыточных замыкающих нулей.
  • QUANTIZE(expr1, expr2). Функция QUANTIZE возвращает значение DECFLOAT, равное по значению (за исключением любого округления) и знаку expr1, а также экспонент, равный по значению экспоненту expr2. Функцию QUANTIZE можно использовать для реализации округления с точностью до нужного знака, например, округление до ближайшего цента с использованием режима округления DECFLOAT, как показано в примере 5.
Пример 5. Использование встроенных функций
Таблица items имеет следующие значения столбца itemPrice: 8.230, 13.000, 13 и 8.235.
Предположим, что режим округления в базе данных (decflt_rounding)
установлен в ROUND_HALF_EVEN

1.   a) Возвратить все значения с itemPrice равным 13.000
     SELECT * FROM items WHERE TOTALORDER(itemPrice, 13.000) = 0;
     Возвращает 13.000

     b) Возвратить все значения с itemPrice равным 13 
     SELECT * FROM items WHERE itemPrice = 13;
     Возвращает 13, 13.000

2.   Удалить все замыкающие нули из itemPrice

     SELECT NORMALIZE_DECFLOAT(itemPrice) FROM items;
     Возвращает 8.23, 13, 13, 8.235

3.   Округлить itemPrice до двух знаков после запятой (ближайший цент)

     SELECT QUANTIZE(itemPrice, 1.00) FROM items;
     Возвращает 8.23, 13.00, 13.00, 8.24

Поддержка DECFLOAT в клиентских приложениях

Основные клиентские интерфейсы CLI, Microsoft .NET и JDBC поддерживают тип данных DECFLOAT. Кроме того, процессор командной строки (Command-Line Processor - CLP) тоже поддерживает DECFLOAT.

Приложения могут синхронизировать режим округления между клиентом и сервером следующим образом:

  • Узнать режим округления на сервере путем запроса специального регистра CURRENT DECFLOAT ROUNDING MODE.
  • Установить аналогичный режим округления на клиенте, например, CLI-атрибут sql_attr_decfloat_rounding_mode.

Это гарантирует, что режимы округления будут одинаковы на клиенте и на сервере. Попытка установить режим округления на сервере при помощи команды SET CURRENT DECFLOAT ROUNDING MODE в значение, отличное от указанного в конфигурационном параметре базы данных (decflt_rounding), возвратит ошибку. Таким образом, команда SET CURRENT DECFLOAT ROUNDING MODE поддерживается для того, чтобы вы могли убедиться в идентичности режимов округления на сервере и на клиенте.


Интересно знать, почему?

В данном разделе обсуждаются некоторые вопросы, связанные с типом DECFLOAT, которые могут быть не всегда очевидны. Также рассмотрены некоторые моменты, которые поначалу озадачили тестировщиков IBM.

Вопрос. Я ввожу значение -0 (отрицательный ноль) в столбец DECFLOAT, но знак минус игнорируется и вместо него вставляется значение 0 (положительный ноль), почему?

Ответ. Обработка констант в DB2 рассматривает 0 как INTEGER, и когда к ней применяется операция отрицания, результат все равно равен 0. Для вставки значения -0 в базу данных используйте выражение DECFLOAT('-0').

Вопрос. Я выполнил вычисление с большими значениями DECFLOAT. Я думаю, что произошло переполнение, но мое приложение продолжает выполняться с предупреждением. Почему?

Ответ. Согласно IEEE754r, при возникновении арифметической исключительной ситуации во время операции с типом DECFLOAT все равно возвращается значение. В SQL это выражается в возврате кода предупреждения sqlcode вместе со специальным значением результата операции, как указано в спецификации IEEE.

Вопрос. Использует ли встроенная функция ROUND() установленный режим округления типа DECFLOAT для входных значений DECFLOAT?

Ответ. Нет. ROUND поддерживает только ROUND_HALF_UP в качестве режима округления, даже для значений DECFLOAT. Для округления в соответствии с заданным режимом округления DECFLOAT используйте функцию QUANTIZE().

Вопрос. Я попытался изменить режим округления, используя команду SET CURRENT DECFLOAT ROUNDING MODE, но потерпел неудачу. Почему?

Ответ. Специальный регистр CURRENT DECFLOAT ROUNDING MODE получает свое значение из конфигурационного параметра базы данных decflt_rounding и не может быть установленным в значение, отличное от указанного в decflt_rounding. Эта команда поддерживается для совместимости с семейством DB2 и позволяет клиентским приложениям проверить идентичность режима округления на клиенте и на сервере.

Вопрос. У меня есть константы в экспоненциальном представлении, но, кажется, они не представляются точно. Например, при попытке вставить 1e6000 в столбец DECFLOAT(34) я получаю ошибку переполнения. Почему?

Ответ. Существующая поддержка констант в DB2 не изменилась с реализацией DECFLOAT. Таким образом, существующие константы имеют тип INTEGER, DECIMAL или DOUBLE. Единственным исключением являются специальные значения DECFLOAT, которые рассматриваются как константы DECFLOAT. Хотя константы DECIMAL обычно преобразуются в DECFLOAT без каких-либо потерь в точности, литералы DOUBLE сначала аппроксимируются в двоичное число с плавающей запятой, а затем преобразуются в десятичное число с плавающей запятой. При работе со значениями в экспоненциальном представлении используйте выражение DECFLOAT(‘1e6000’) для вызова приведения типа string в DECFLOAT.


Сравнение DECIMAL и DOUBLE

В таблице 3 приведено сравнение между типами данных DECFLOAT и DECIMAL.

Таблица 3. Сравнение DECFLOAT и DECIMAL
АтрибутDECIMALDECFLOAT
Стандарты Семантика определяется проприетарными реализациями; высокая стоимость разработки приложений из-за необходимости учета расхождений. Семантика определяется промышленными стандартами (IEEE754r), поэтому адаптированные приложения должны вести себя одинаково, что снижает затраты на разработку приложений.
Поддержка в языках Большинство компиляторов C и C++ не реализуют упакованные типы данных DECIMAL. Кроме многих других языков, появляется поддержка десятичных чисел с плавающей запятой в C и C++. В настоящее время десятичные числа с плавающей запятой реализованы в XL C/C++ 9.0 и gcc 4.2.
Производительность Более низкая, потому что все арифметические вычисления выполняет программное обеспечение. Более высокая, благодаря аппаратной поддержке десятичных чисел с плавающей запятой (в настоящее время на POWER6).
Занимаемое пространство От 1 до 16 байтов фиксированной длины в зависимости от определения столбца. 8 или 16 байтов фиксированной длины в зависимости от определения столбца.
Поддержка округления Ограничена режимом ROUND_DOWN
(или усечением) в большинстве случаев.
Выбор из пяти режимов округления, которые можно установить при помощи конфигурационного параметра базы данных decflt_rounding.

В таблице 4 приведено сравнение между типами данных DECFLOAT и DOUBLE.

Таблица 4. Сравнение DECFLOAT и DOUBLE
АтрибутDOUBLEDECFLOAT
Точность для финансовых вычислений DOUBLE - это тип данных двоичных чисел с плавающей запятой, аппроксимирующий десятичные числа; идеален для научных приложений, допускающих аппроксимации. DECFLOAT идеален для финансовых приложений, которые не допускают аппроксимаций.
Пределы Тип данных DOUBLE не может хранить числа, большие 1.7e308 (примерно). Тип данных DECFLOAT(34) может хранить очень большие числа - до 9.99e6144 (примерно), что важно для некоторых классов научных приложений.
Производительность Более высокая, поскольку все арифметические операции выполняются в двоичном виде (основание 2). Даже при наличии аппаратной поддержки DECFLOAT медленнее, поскольку все арифметические операции выполняются в десятичном виде (основание 10).
Поддержка округления Реализация типа данных DOUBLE в DB2 не поддерживает интерфейс для изменения режима округления, а по умолчанию используется ROUND_HALF_EVEN. Выбор из пяти режимов округления, которые можно установить при помощи конфигурационного параметра базы данных decflt_rounding.

Резюме

DECFLOAT - это новый тип данных в DB2 для Linux, UNIX и Windows, совместимый с промышленным стандартом IEEE754r. Используя аппаратную поддержку (на процессорах POWER6), DECFLOAT предоставляет приложениям преимущество в производительности по сравнению с DECIMAL. Кроме того, DECFLOAT - это самый большой тип данных, как по амплитуде, так и по точности. DECFLOAT поддерживает пять режимов округления:

  • ROUND_CEILING
  • ROUND_FLOOR
  • ROUND_HALF_UP
  • ROUND_HALF_EVEN
  • ROUND_DOWN

Установить режим округления можно путем настройки конфигурационного параметра базы данных decflt_rounding.

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

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management
ArticleID=360499
ArticleTitle=DECFLOAT - тип данных будущего
publish-date=12222008