IEEE 754-2008 (ранее известный как IEEE 754r) был опубликован в августе 2008 года и является важным пересмотр, и заменяет, IEEE 754-1985 с плавающей точкой стандарта, в то время как в 2019 году он был обновлен с пересмотром незначительной IEEE 754-2019. Редакция 2008 года расширила предыдущий стандарт там, где это было необходимо, добавила десятичную арифметику и форматы, ужесточила некоторые области исходного стандарта, которые оставались неопределенными, и объединила их в IEEE 854 (стандарт с плавающей запятой, не зависящий от системы счисления).
В некоторых случаях, когда более строгие определения двоичной арифметики с плавающей запятой могли быть несовместимы по производительности с некоторыми существующими реализациями, они были сделаны необязательными.
Стандарт находился в процессе пересмотра с 2000 года, а окончательная дата его завершения - декабрь 2006 года. Пересмотр стандарта IEEE в целом состоит из трех этапов:
11 июня 2008 года он был единогласно одобрен Комитетом по пересмотру IEEE (RevCom), и он был официально одобрен Советом по стандартам IEEE-SA 12 июня 2008 года. Он был опубликован 29 августа 2008 года.
Участие в разработке стандарта было открыто для людей, хорошо разбирающихся в арифметике с плавающей запятой. Более 90 человек посетили по крайней мере одно из ежемесячных собраний, которые проводились в Кремниевой долине, и многие другие приняли участие через список рассылки.
Иногда прогресс был медленным, в результате чего председатель заявил на заседании 15 сентября 2005 г., что «никакого прогресса не наблюдается, я приостанавливаю эти встречи до дальнейшего уведомления по этим причинам». В декабре 2005 года комитет был реорганизован в соответствии с новыми правилами с планируемой датой завершения работы в декабре 2006 года.
В феврале 2006 г. были приняты новые политики и процедуры. В сентябре 2006 г. был утвержден рабочий проект для отправки в родительский спонсирующий комитет (комитет по стандартам микропроцессоров IEEE или MSC) для редактирования и отправки в бюллетень спонсоров.
Последняя версия проекта 1.2.5, представленная в MSC, была от 4 октября 2006 г. MSC принял проект 9 октября 2006 г. Проект был существенно изменен в деталях в процессе голосования.
Первое голосование спонсоров проводилось с 29 ноября по 28 декабря 2006 года. Из 84 членов органа с правом голоса ответили 85,7% - 78,6% проголосовали за. Были голоса против (и более 400 комментариев), поэтому в марте 2007 года было проведено повторное голосование; это получило одобрение 84%. В этом бюллетене было достаточно комментариев (более 130) о том, что был подготовлен третий проект для второго, 15-дневного, повторного голосования, которое началось в середине апреля 2007 года. По техническим причинам процесс голосования был возобновлен с 4-го тура в октябре. 2007; в проект также были внесены существенные изменения в результате комментариев 650 избирателей и запросов спонсора (IEEE MSC); этот бюллетень просто не получил требуемого 75% одобрения. Пятый тур голосования получил 98,0% откликов при одобрении 91,0%, при этом комментарии привели к относительно небольшим изменениям. Шестое, седьмое и восьмое голосование подтвердили рейтинг одобрения более 90% с постепенным уменьшением количества комментариев по каждому проекту; восьмой (у которого не было замечаний, относящихся к сфере охвата: 9 повторяли предыдущие комментарии, а один относился к материалам, не включенным в проект) был представлен Комитету по пересмотру стандартов IEEE («RevCom») для утверждения в качестве стандарта IEEE.
Комитет по пересмотру стандартов IEEE (RevCom) рассмотрел и единогласно одобрил проект IEEE 754r на своем заседании в июне 2008 года, и он был одобрен Советом по стандартам IEEE-SA 12 июня 2008 года. Окончательное редактирование завершено, и теперь документ направлен в Отдел публикаций стандартов IEEE для публикации.
Новый стандарт IEEE 754 (формально IEEE Std 754-2008, стандарт IEEE для арифметики с плавающей запятой) был опубликован компьютерным сообществом IEEE 29 августа 2008 г. и доступен на веб-сайте IEEE Xplore.
Этот стандарт заменяет IEEE 754-1985. IEEE 854, Radix-независимый стандарт с плавающей запятой, был отозван в декабре 2008 года.
Наиболее очевидными улучшениями в стандарте являются добавление 16-битного и 128-битного двоичного типа и трех десятичных типов, некоторые новые операции и многие рекомендуемые функции. Однако повсюду были внесены существенные уточнения в терминологию. Это краткое изложение подчеркивает основные различия в каждом из основных разделов стандарта.
Объем (определяемый спонсором стандарта) был расширен за счет включения десятичных форматов и арифметики, а также добавлены расширяемые форматы.
Многие определения были переписаны для уточнения и единообразия. Некоторые термины были переименованы для ясности (например, денормализованный был переименован в субнормальный).
Описание форматов было сделано более регулярным, с разграничением между арифметическими форматами (в которых может выполняться арифметика) и форматами обмена (которые имеют стандартное кодирование). Соответствие стандарту теперь определяется в этих терминах.
Уровни спецификации формата с плавающей запятой были перечислены, чтобы прояснить различие между:
Затем подробно объясняются наборы представимых сущностей, показывая, что с ними можно обращаться, когда значащая величина рассматривается либо как дробь, либо как целое число. Определены конкретные наборы, известные как базовые форматы, и объяснены кодировки, используемые для обмена двоичными и десятичными форматами.
К двоичным форматам обмена добавлены « половинная точность » (16-битный формат хранения) и « четырехкратная точность » (128-битный формат), а также обобщенные формулы для некоторых более широких форматов; основные форматы имеют 32-битную, 64-битную и 128-битную кодировку.
Описаны три новых десятичных формата, соответствующие длинам 32–128-битных двоичных форматов. Они дают десятичные форматы обмена с 7, 16 и 34-значными значащими значениями, которые могут быть нормализованы или ненормализованы. Для максимального диапазона и точности форматы объединяют часть экспоненты и мантиссы в поле комбинации и сжимают оставшуюся часть мантиссы, используя либо десятичное целочисленное кодирование (которое использует Densely Packed Decimal, либо DPD, сжатую форму BCD ). или обычное двоичное целочисленное кодирование. Основными форматами являются два больших размера, которые имеют 64-битную и 128-битную кодировку. Также указаны обобщенные формулы для некоторых других форматов обмена.
Расширенные и расширяемые форматы позволяют выполнять арифметические операции с другими точностями и диапазонами.
Этот пункт был изменен, чтобы поощрять использование статических атрибутов для управления операциями с плавающей запятой и (в дополнение к обязательным атрибутам округления) разрешать альтернативную обработку исключений, расширение промежуточных результатов, оптимизацию изменения значений и воспроизводимость.
Добавлен атрибут округления до ближайшего, связи от нуля (требуется только для десятичных операций).
В этом разделе есть многочисленные пояснения (особенно в области сравнений), и теперь требуется несколько ранее рекомендованных операций (таких как копирование, отрицание, abs и класс).
Новые операции включают объединенное умножение-сложение (FMA), явные преобразования, предикаты классификации (isNan ( x) и т. Д.), Различные функции min и max, общий предикат упорядочивания и две операции, специфичные для десятичных чисел (samequantum и quantize).
В мин и макс операции определены, но оставить некоторую свободу действий для случая, когда входы равны по величине, но отличаются в представлении. Особенно:
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 года. Было много сторонних обсуждений и вопросов, не охваченных процессом стандартизации, нижеперечисленные вопросы стали достоянием общественности: