Состояние и содержание спецификации TR2 WRT C++
Ссылка Ссылка: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2849.pdf
Я пытаюсь собрать информацию о TR2 и о том, как он относится к грядущему стандарту C++, если это вообще произойдет.
Вот мои вопросы до сих пор. Если я пропустил какие-либо важные вопросы, пожалуйста, ответьте на них.:)
Отборочные:
- Текущий стандарт C++ ничего не говорит о точном двоичном представлении значений с плавающей точкой. Все, что он говорит, - то, что представление с плавающей точкой - "определенная реализация". На практике каждая известная мне реализация использует IEEE 754-2008. Но это не требование стандарта.
- TR2 определяет новые типы, которые будут добавлены к языку:
decimal32
,decimal64
, а такжеdecimal128
,
Вопросы / очки для комментариев:
- Есть новые типы выше (
decimal64
и т. д.) будет родным для языка или предоставленным в библиотеке? - Делают ли новые типы что-нибудь для решения проблемы неточностей с плавающей запятой? Если так, то как?
- Требует ли TR2 конкретное двоичное представление для этих (или любых) типов?
- Будет ли TR2 принят в качестве части будущего стандарта C++? Если да, то когда?
- Доступна ли реализация этих новых типов в любой доступной в настоящее время библиотеке (например, Boost)?
3 ответа
К вашему сведению, связанный документ не TR2. "TR2" относится к набору расширений библиотеки в том же стиле, что и TR1, в то время как черновик для "десятичных арифметических расширений с плавающей запятой" является именно этим. Черновика TR2 еще нет, и изначально планировалось, что он выйдет после 0x. Итак, с этого момента, я предполагаю, что вы спрашиваете не о TR2, а о связанном документе.
- Библиотека: Тем не менее, проект определяет новые классы в
std::decimal
который может легко обернуть собственный тип, предоставляемый платформой / реализацией Этот TR не определяет десятичные литералы. - Да: "Наиболее эффективный способ избежать ошибки преобразования - это использовать десятичную арифметику. Признавая это, стандарт IEEE 754-2008 для арифметики с плавающей запятой определяет десятичное кодирование с плавающей запятой и арифметику. В этом техническом отчете определяются расширения Международного стандарта для язык программирования C++, позволяющий использовать десятичную арифметику в соответствии со стандартом IEEE 754-2008 ".
- Да: три формата десятичного кодирования, определенные в IEEE 754-2008, соответствуют трем десятичным типам с плавающей запятой
std::decimal::decimal32
, 64 и 128. Обратитесь кdecimalN
ссылки в таблице здесь. - В текущем проекте C++0x нет никаких признаков этих предложений. Может быть, в следующем стандарте, но даже члены комитета не могут сказать вам, когда это выйдет.
- Я не видел ни одной десятичной библиотеки, упоминающей этот конкретный черновик, когда выполнял быстрый поиск в Интернете, но есть несколько, если вам просто нужна библиотека.
Я оказался на совещании, где IBM изначально предложила десятичные типы для WG14 и WG21. Их первоначальное предложение состояло в том, чтобы предоставить их как нативные типы, что в значительной степени является единственным решением в C. Однако WG21 не был полностью убежден и указал, что C++ уже имеет std::complex<>
как математический тип в библиотеке, так почему бы и нет std::decimal<>
? Первоначальная путаница в отношении производительности была быстро закончена, когда было указано, что std::decimal
очевидно, может обернуть _Decimal
расширение компилятора.
После выяснения того, что это можно сделать в библиотеке, следующий вопрос заключался в том, должно ли это быть в стандартной библиотеке. Это ведь специализированный домен, в котором это полезно. Самая распространенная область - финансы - на самом деле в этом не нуждается (им действительно нужна десятичная с фиксированной запятой, а не десятичная с плавающей запятой). После этого отзыва IBM не стала продвигать свое предложение намного дальше.
Эти типы не решают проблему неточностей с плавающей точкой. 1/3 все еще не представима. Однако 1/5 есть.