Ответ 1
Decimal TR определяет перегрузки для ввода и вывода в разделах 3.2.10 и 3.2.11 соответственно. По внешнему виду они не реализованы gcc. Десятичная поддержка в gcc реализована в терминах libdecnum, которая предоставляет процедуры для преобразования из и в строки. Я бы создал простую реализацию операторов ввода-вывода, используя их для начала работы.
Изменить в 2012-10-17: глядя на форматирование десятичных значений в gcc-библиотеке (std::decimal::decimal64
и family), выяснилось, что gcc, к сожалению, не устанавливает ни заголовки библиотеки decNumber, ни библиотеку. Кроме того, другие источники decNumber не совсем совпадают с доставкой версии с gcc. В результате единственный способ найти десятичные числа, отформатированные, состоит в том, чтобы использовать явные объявления и использовать сборку библиотеки при компиляции gcc.
Простая часть является источником, хотя и для довольно простой реализации. Во-первых, декларация, которая попадает в подходящий заголовок, например. <decimal/decimal>
:
std::ostream& operator<< (std::ostream&, std::decimal::decimal32 const&);
std::ostream& operator<< (std::ostream&, std::decimal::decimal64 const&);
std::ostream& operator<< (std::ostream&, std::decimal::decimal128 const&);
Довольно простая реализация чего-то, делающего некоторое форматирование, хотя без каких-либо параметров может выглядеть так:
extern "C" char* decimal32ToString(std::decimal::decimal32 const*, char*);
extern "C" char* decimal64ToString(std::decimal::decimal64 const*, char*);
extern "C" char* decimal128ToString(std::decimal::decimal128 const*, char*);
std::ostream& operator<< (std::ostream& out,
std::decimal::decimal32 const& value)
{
char buffer[128];
decimal32ToString(&value, buffer);
return out << buffer;
}
std::ostream& operator<< (std::ostream& out,
std::decimal::decimal64 const& value)
{
char buffer[128];
decimal64ToString(&value, buffer);
return out << buffer;
}
std::ostream& operator<< (std::ostream& out,
std::decimal::decimal128 const& value)
{
char buffer[128];
decimal128ToString(&value, buffer);
return out << buffer;
}
С этим на месте все еще остается проблема, из-за которой мне не удалось создать что-либо с использованием десятичных знаков, если не используется некоторый уровень оптимизации, т.е. -O1
(или выше). При отсутствии оптимизации используются символы без ссылок, но это совершенно не связано с печатью значений. Чтобы получить определения функций, используемых в реализации, мне нужно было связать с библиотекой libdecnumber.a
, которая создается во время сборки gcc:
g++ -o prog decimal-io.cpp main.cpp <gcc-build-root>/libdecnumber/libdecnumber.a
Кроме того, у меня есть моя собственная реализация Decimal TR с некоторое расширение, и основывая его на библиотеке decnumber и правильно внедряя I/O. Моя реализация, надеюсь, станет общедоступной в какой-то момент, но не скоро.