IEEE 754-2008 (ранее известный как IEEE 754r ) — это пересмотренный вариант стандарта IEEE 754 для арифметики с плавающей точкой . Он был опубликован в августе 2008 года и является значительным пересмотренным вариантом стандарта IEEE 754-1985 и заменяет его . Пересмотр 2008 года расширил предыдущий стандарт там, где это было необходимо, добавил десятичную арифметику и форматы, ужесточил некоторые области исходного стандарта, которые остались неопределенными, и объединил в IEEE 854 (стандарт с плавающей точкой, независимый от основания). В нескольких случаях, когда более строгие определения двоичной арифметики с плавающей точкой могли быть несовместимы с производительностью с некоторой существующей реализацией, они были сделаны необязательными. В 2019 году он был обновлен с помощью незначительного пересмотра IEEE 754-2019 . [1]
Стандарт пересматривался с 2000 года, и его завершение было запланировано на декабрь 2006 года. Пересмотр стандарта IEEE в целом следует трем этапам:
11 июня 2008 года он был единогласно одобрен Комитетом по ревизии IEEE (RevCom), а 12 июня 2008 года он был официально одобрен Советом по стандартам IEEE-SA. Он был опубликован 29 августа 2008 года.
Участие в разработке стандарта было открыто для людей с солидными знаниями арифметики с плавающей точкой. Более 90 человек посетили по крайней мере одну из ежемесячных встреч, которые проводились в Кремниевой долине , и многие другие приняли участие через список рассылки.
Прогресс временами был медленным, что привело к тому, что председатель на заседании 15 сентября 2005 года [2] заявил , что «никакого прогресса не наблюдается, я приостанавливаю эти заседания до дальнейшего уведомления по этим причинам». В декабре 2005 года комитет был реорганизован в соответствии с новыми правилами с целевой датой завершения в декабре 2006 года.
Новые политики и процедуры были приняты в феврале 2006 года. В сентябре 2006 года был одобрен рабочий проект для отправки в родительский спонсирующий комитет (Комитет по стандартам микропроцессоров IEEE, или MSC) для редактирования и отправки на голосование спонсоров.
Последняя версия проекта, версия 1.2.5, представленная в MSC, была датирована 4 октября 2006 года. [3] MSC принял проект 9 октября 2006 года. Проект был значительно изменен в деталях в процессе голосования.
Первый спонсорский тур голосования проходил с 29 ноября 2006 года по 28 декабря 2006 года. Из 84 членов голосующего органа 85,7% ответили — 78,6% проголосовали за одобрение. Были отрицательные голоса (и более 400 комментариев), поэтому в марте 2007 года было проведено повторное голосование; оно получило одобрение 84%. Было получено достаточно комментариев (более 130) от этого голосования, чтобы был подготовлен третий проект для второго, 15-дневного, повторного голосования, которое началось в середине апреля 2007 года. По технической причине процесс голосования был возобновлен с 4-го голосования в октябре 2007 года; также были существенные изменения в проекте в результате 650 комментариев избирателей и запросов от спонсора (IEEE MSC); это голосование просто не достигло требуемого одобрения в 75%. 5-й тур имел 98,0% ответов с 91,0% одобрения, с комментариями, ведущими к относительно небольшим изменениям. 6-й, 7-й и 8-й туры сохранили рейтинг одобрения более 90% с постепенно уменьшающимся количеством комментариев по каждому проекту; 8-й (в котором не было комментариев по теме: 9 были повторениями предыдущих комментариев и один относился к материалу, отсутствовавшему в проекте) был представлен в Комитет по пересмотру стандартов IEEE ('RevCom') для утверждения в качестве стандарта IEEE.
Комитет по пересмотру стандартов IEEE (RevCom) рассмотрел и единогласно одобрил проект IEEE 754r на своем заседании в июне 2008 года, а 12 июня 2008 года он был одобрен Советом по стандартам IEEE-SA. Окончательное редактирование завершено, и в настоящее время документ передан в Отдел публикаций стандартов IEEE для публикации.
Новый стандарт IEEE 754 (официально IEEE Std 754-2008, стандарт IEEE для арифметики с плавающей точкой) был опубликован IEEE Computer Society 29 августа 2008 года и доступен на веб-сайте IEEE Xplore [4]
Этот стандарт заменяет IEEE 754-1985 . IEEE 854, стандарт чисел с плавающей точкой, не зависящий от радиуса, был отменен в декабре 2008 года.
Наиболее очевидными усовершенствованиями стандарта являются добавление 16-битного и 128-битного двоичного типа и трех десятичных типов, некоторых новых операций и многих рекомендуемых функций. Однако в терминологии были внесены существенные уточнения. В этом резюме выделены основные различия в каждом основном пункте стандарта.
Область применения (определенная спонсором стандарта) была расширена и теперь включает десятичные форматы и арифметику, а также добавляет расширяемые форматы.
Многие определения были переписаны для ясности и согласованности. Несколько терминов были переименованы для ясности (например, денормализованный был переименован в субнормальный ).
Описание форматов стало более регулярным, с разграничением арифметических форматов (в которых может выполняться арифметика) и форматов обмена (имеющих стандартную кодировку). Соответствие стандарту теперь определяется этими терминами.
Были перечислены уровни спецификации формата с плавающей точкой, чтобы прояснить различие между:
Затем подробно объясняются наборы представляемых сущностей, показывая, что их можно обрабатывать, рассматривая значимую часть как дробь или целое число. Определены конкретные наборы, известные как базовые форматы , и объясняются кодировки, используемые для обмена двоичными и десятичными форматами.
В форматы двоичного обмена добавлены « половинная точность » (16-битный формат хранения) и « четверная точность » (128-битный формат), а также обобщенные формулы для некоторых более широких форматов; основные форматы имеют 32-битное, 64-битное и 128-битное кодирование.
Описаны три новых десятичных формата, соответствующих длинам 32–128-битных двоичных форматов. Они дают десятичные форматы обмена с 7-, 16- и 34-разрядными значащими, которые могут быть нормализованы или ненормализованы. Для максимального диапазона и точности форматы объединяют часть экспоненты и значащую часть в поле комбинации и сжимают остаток значащей части, используя либо десятичное целочисленное кодирование (которое использует Densely Packed Decimal , или DPD, сжатую форму BCD ), либо обычное двоичное целочисленное кодирование. Базовыми форматами являются два больших размера, которые имеют 64-битное и 128-битное кодирование. Также указаны обобщенные формулы для некоторых других форматов обмена.
Расширенные и расширяемые форматы позволяют выполнять арифметические операции с другими уровнями точности и диапазонами.
Этот пункт был изменен, чтобы поощрять использование статических атрибутов для управления операциями с плавающей точкой и (в дополнение к обязательным атрибутам округления) разрешать альтернативную обработку исключений, расширение промежуточных результатов, оптимизацию изменения значений и воспроизводимость.
Добавлен атрибут округления до ближайшего целого числа с удалением от нуля (требуется только для десятичных операций ) .
В этом разделе содержится множество пояснений (особенно в области сравнений), а несколько ранее рекомендуемых операций (таких как копирование, отрицание, абсцисса и класс) теперь являются обязательными.
Новые операции включают объединенное умножение-сложение (FMA), явные преобразования, предикаты классификации (isNan( x ) и т. д.), различные функции min и max, предикат общего упорядочения и две операции, специфичные для десятичных чисел (samequantum и quantize).
Операции min и max определены, но оставляют некоторую свободу действий для случая, когда входные данные равны по значению, но различаются по представлению. В частности:
min(+0,−0)
или min(−0,+0)
должен выдать что-то со значением ноль, но всегда может вернуть первый аргумент.Для поддержки таких операций, как работа с окнами, в которых входное значение NaN должно быть незаметно заменено одной из конечных точек, min и max определяются для выбора числа x вместо незаметного значения NaN:
min(x,qNaN) = min(qNaN,x) = x
max(x,qNaN) = max(qNaN,x) = x
Эти функции называются minNum и maxNum, чтобы указать их предпочтение для числа по сравнению с тихим NaN. Однако при наличии сигнального входа NaN возвращается тихий NaN, как и в случае обычных операций. После публикации стандарта было замечено, что эти правила делают эти операции неассоциативными; по этой причине они были заменены новыми операциями в IEEE 754-2019 .
В этом разделе также определяется десятичная арифметика, совместимая с используемой в Java , C# , PL/I , COBOL , Python , REXX и т. д. В целом, десятичная арифметика следует тем же правилам, что и двоичная арифметика (результаты правильно округляются и т. д.), с дополнительными правилами, которые определяют показатель степени результата (во многих случаях возможно больше одного).
В отличие от 854, 754-2008 требует правильного округления основания преобразования между десятичной и двоичной плавающей точкой в диапазоне, который зависит от формата.
Этот пункт был пересмотрен и уточнен, но без существенных дополнений. В частности, он дает формальные рекомендации по кодированию состояния сигнал/тишина NaN .
Этот пункт был пересмотрен и значительно уточнен, однако без существенных дополнений.
Этот пункт был расширен из предыдущего пункта 8 («Ловушки»), чтобы разрешить необязательную обработку исключений в различных формах, включая ловушки и другие модели, такие как try/catch. Ловушки и другие механизмы исключений остаются необязательными, как и в IEEE 754-1985.
Этот пункт новый; он рекомендует пятьдесят операций, включая логарифмические, степенные и тригонометрические функции, которые должны быть определены стандартами языка. Все они необязательны (ни одна не требуется для соответствия стандарту). Операции включают некоторые динамические режимы для атрибутов, а также набор операций редукции (сумма, масштабированное произведение и т. д.).
Этот пункт является новым; он рекомендует, как языковые стандарты должны определять семантику последовательностей операций, и указывает на тонкости буквальных значений и оптимизаций, которые изменяют значение результата.
Этот пункт является новым; в нем рекомендуется, чтобы стандарты языка предоставляли средства для написания воспроизводимых программ (т. е. программ, которые будут выдавать одинаковый результат во всех реализациях языка), и описывается, что необходимо сделать для достижения воспроизводимых результатов.
Это новое приложение; в нем перечислены некоторые полезные ссылки.
Это новое приложение; оно содержит руководство для разработчиков отладчиков по функциям, которые необходимы для поддержки отладки кода с плавающей точкой.
Это новый индекс, в котором перечислены все операции, описанные в стандарте (обязательные или необязательные).
Из-за изменений в конструкции и разработке ЦП стандарт IEEE с плавающей точкой 2008 года можно считать историческим или устаревшим, как и стандарт 1985 года, который он заменил. Было много внешних обсуждений и пунктов, не охваченных процессом стандартизации, ниже приведены пункты, которые стали общедоступными: