[libstdc++] decimal float support (take 3)

Ed Smith-Rowland 3dw4rd@verizon.net
Sun Oct 4 16:00:00 GMT 2009


Ed Smith-Rowland wrote:
> Benjamin Kosnik wrote:
>>> If the documentation says that the decimal header is supported when
>>> the C++ compiler supports scalar decimal floating-point arithmetic
>>> via types defined with __attribute((mode(SD|DD|TD))), is it OK if the
>>> header is always installed?
>>>     
>>
>> Yes. That's the joy of putting it in tr24733 (not because it's
>> documented.)
>>
>> As long as it's not in the default place then we're all cool all the
>> time.
>>
>>  
>>> There are several parts of TR 24733 that are not yet implemented, and
>>> I have questions about some of those.  What's a good forum for
>>> discussing those?
>>>     
>>
>> Apparently, this one.
>>  
>>> 2009-10-01  Janis Johnson  <janis187@us.ibm.com>
>>>
>>>     * doc/Makefile.am: Process new file.
>>>     * doc/xml/manual/intro.xml: Ditto.
>>>     * doc/xml/manual/using.xml: Document new header.
>>>     * doc/xml/manual/status_cxxtr24733.xml: New file.
>>>     * include/Makefile.am: Process new headers.
>>>     * include/tr24733/decimal: New file.
>>>     * include/tr24733/decimal.h: New file.
>>>     
>>
>> This, plus the testsuite patch, and with my small fixes are attached.
>>
>> The attached version is ok to check in. I've built and tested it on
>> x86_64/linux, generated all the docs.
>> Please wait 24 hours for Paolo or others to comment or disagree.
>>
>>  
>>> Index: libstdc++-v3/include/tr24733/decimal
>>> +
>>> +  // ISO/IEC TR 24733  3.2.7  Unary arithmetic operators.
>>> +  decimal32  operator+(decimal32 __rhs);
>>> +  decimal64  operator+(decimal64 __rhs);
>>> +  decimal128 operator+(decimal128 __rhs);
>>> +  decimal32  operator-(decimal32 __rhs);
>>> +  decimal64  operator-(decimal64 __rhs);
>>> +  decimal128 operator-(decimal128 __rhs);
>>> +
>>> +  // ISO/IEC TR 24733  3.2.8  Binary arithmetic operators.
>>> +#define _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(_Op, _T1, _T2,
>>> _T3)    \
>>> +  _T1 operator _Op(_T2 lhs, _T3 __rhs);
>>> +#define _DECLARE_DECIMAL_BINARY_OP_WITH_INT(_Op, _Tp)
>>> \
>>> +  _Tp operator _Op(_Tp lhs, int
>>> __rhs);                \
>>> +  _Tp operator _Op(_Tp lhs, unsigned int __rhs);        \
>>> +  _Tp operator _Op(_Tp lhs, long __rhs);            \
>>> +  _Tp operator _Op(_Tp lhs, unsigned long __rhs);        \
>>> +  _Tp operator _Op(_Tp lhs, long long __rhs);
>>> \
>>> +  _Tp operator _Op(_Tp lhs, unsigned long long
>>> __rhs);        \
>>> +  _Tp operator _Op(int lhs, _Tp
>>> __rhs);                \
>>> +  _Tp operator _Op(unsigned int lhs, _Tp __rhs);        \
>>> +  _Tp operator _Op(long lhs, _Tp __rhs);            \
>>> +  _Tp operator _Op(unsigned long lhs, _Tp __rhs);        \
>>> +  _Tp operator _Op(long long lhs, _Tp __rhs);
>>> \
>>> +  _Tp operator _Op(unsigned long long lhs, _Tp __rhs);
>>> +
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal32, decimal32,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(+, decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal32,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal64,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal64,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(+, decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal32,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal64,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(+, decimal128)
>>> +
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal32, decimal32,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(-, decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal32,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal64,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal64,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(-, decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal32,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal64,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(-, decimal128)
>>> +
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal32, decimal32,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(*, decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal32,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal64,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal64,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(*, decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal32,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal64,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(*, decimal128)
>>> +
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal32, decimal32,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(/, decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal32,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal64,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal64,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(/, decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal32,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal64,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128,
>>> decimal32)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128,
>>> decimal64)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128,
>>> decimal128)
>>> +  _DECLARE_DECIMAL_BINARY_OP_WITH_INT(/, decimal128)
>>> +
>>> +#undef _DECLARE_DECIMAL_BINARY_OP_WITH_DEC
>>> +#undef _DECLARE_DECIMAL_BINARY_OP_WITH_INT
>>>     
>>
>> YUCK!
>>
>> You say macro, I say templatized base class. I'm willing to work
>> through this issue after it's in.
>>
>> best,
>> benjamin
> I think that in the spirit of having tr1 components in a subdirectory 
> named after the namespace it might be better to have the decimal 
> extension under a decimal directory.  That name would make it more 
> recognizable for people and it would be just as "hidden".
>
> Just a thought.
>
> I also found out that make install doesn't install decimal.  I may 
> have an older patch though.  I'll try it with this one.
>
> Nice work by the way.
>
>
I also tried this on a system that didn't have decimal support (I don't 
know I I needed to explicitly configure or not, it was ppc macos).  I 
think it would be nice to get a _GLIBCXX_HAVE_DECIMAL_FLOAT into 
c++config.h and then #error gracefully in <decimal>.  I'm not familiar 
enough with the build and config machinery just yet.

Ed



More information about the Libstdc++ mailing list