Почему decimal128, вероятно, будет стандартизирован, а точность quad не будет?

Это очень наивный вопрос. Если мы посмотрим на комитеты стандартов C и С++, они в настоящее время работают над добавлением десятичных чисел с плавающей запятой:

Похоже, что мы, вероятно, будем иметь стандартизованный тип decimal128, пока у нас пока нет стандартизованного типа binary128 (четырехмерная точность, а не просто расширенная двойная точность). Есть ли техническая причина для этой ситуации или чисто "политическая"?

Ответ 1

Квадратная точность двоичной с плавающей запятой не является заменой десятичного типа. Проблема точности является вторичной по сравнению с представлением десятичных чисел. Идея состоит в том, чтобы добавить тип к языкам для поддержки представления чисел типа 0.1 без потери точности - что-то, что вы не можете сделать с двоичным типом с плавающей запятой, независимо от того, насколько высока его точность.

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

Человеческое вычисление и связь числовых значений почти всегда используют десятичную арифметические и десятичные обозначения. Лабораторные заметки, научные статьи, юридические документы, бизнес отчеты и финансовые отчеты записывают числовые значения в десятичной форме. Когда числовые данные заданный программе или отображаемый пользователю, требуется двоичное преобразование с десятичной точностью и обратно. В таких преобразованиях есть присущие ошибки округления; десятичных дробей в общие, должны быть представлены в точности двоичными значениями с плавающей запятой. Эти ошибки часто вызывают удобство использования и проблемы с эффективностью, в зависимости от приложения.

Ответ 2

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

  • IEEE 754 (2008) определяет три основных десятичных формата с плавающей запятой (32, 64 и 128 бит). Кажется разумным стандартизировать интерфейсы для всех трех при добавлении поддержки, тем более, что на самом деле нет большой разницы (ну, 32-битная версия не указывает арифметику). Для использования семантики IEEE 754 (2008) потребуется десятичная поддержка с плавающей запятой.
  • В настоящее время определенный формат с плавающей запятой [по-прежнему] не требуется, чтобы следовать семантике IEEE 754 и даже не определяет базу (существуют реализации с использованием базы 2 и базы 16). Для платформ, не использующих IEEE, неясно, как будет расширяться формат. Там, где используется IEEE 754, он основывался на IEEE 754 (1984), который определял только два основных формата и не было предложения, требующего третьего формата.
  • Текущее определение long double достаточно неопределенно и маловероятно, чтобы любой из поставщиков согласился изменить его текущее значение, чтобы использовать семантику 128 бит (IEEE 754): это изменило бы поведение примерно всех реализаций. Я ожидаю возражений против использования IEEE 754 для float и double, то есть любая поддержка IEEE 754 для двоичных плавающих точек будет чем-то совершенно новым, что кто-то должен будет предложить. Я ожидаю, что такое предложение будет несколько противоречивым, например, в отношении того, какие имена использовать и действительно ли добавить 128-битную поддержку, поскольку большинство пользователей ожидают, что он получит аппаратную поддержку, а люди, работающие на аппаратном обеспечении, по-видимому, имеют другие приоритеты, Обратите внимание: никто не ожидает (или должен ожидать) аппаратной поддержки десятичных плавающих точек: хотя есть аппаратная поддержка процессоров Power7 и более поздних версий, ни один другой разработчик не рассматривает эту идею.
  • У меня есть нулевой интерес, использование или опыт использования двоичных 128-битных значений с плавающей запятой. С другой стороны, меня интересуют и используют десятичные плавающие точки (мой опыт несколько ограничен, но он, безусловно, больше, чем использование двоичных 128-битных плавающих). Основное использование, которое у меня есть, - это упростить правильное вычисление с десятичными значениями: да, я понимаю, что можно правильно использовать двоичные числа с плавающей запятой и/или целые числа, но на практике вряд ли кто-либо делает эти вычисления правильно, и почти тривиально делать правильные математика Учитывая, что добавление 128-битных двоичных плавающих точек потребует нетривиальной работы и потенциально может поставить под угрозу совместное предложение, я не собираюсь их добавлять. Конечно, это не значит, что кто-то еще не смог выполнить эту работу.
  • Хотя бинарные плавающие точки могут быть точными, они в основном используются для быстрых вычислений, и округление принимается. Потеря нескольких бит кажется приемлемой. Я понял, что некоторые приложения выиграют от большего диапазона значений, но этот аргумент даст неограниченную поддержку бит. Это рассуждение отличается для десятичных плавающих точек: единственной причиной их использования является точная арифметика и фактически довольно ограниченный набор операций, которые обычно используются. Не столь быстрое вычисление более приемлемо, чем неправильные результаты. Хотя 16 цифр, как правило, достаточны для большинства применений, на самом деле существует несколько применений, которые уже немного превышают 16 цифр или довольно близки. Я полагаю, что эти рассуждения привели людей, работающих в IEEE 754, к включению 128-битных десятичных плавающих точек, когда были добавлены десятичные плавающие точки, тогда как аналогичные рассуждения не использовались, когда бинарные плавающие точки первоначально были стандартизированы.

tl; dr: Нет ничего политического в отношении десятичных 128-битных форматов, которые обрабатываются, а бинарных 128-битных форматов нет: есть предложение для одного, а не для другого, и у автора (мне) нет интереса писать предложения для обоих.

Ответ 3

Существует некоторая работа по поддержке IEEE 754-2008 в ISO C, что означает, что binary128 (и более) могут быть стандартизованы. См. ISO/IEC JTC 1/SC 22/WG 14 N1789. Затем следует С++.

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