1// decimal classes -*- C++ -*-
2
3// Copyright (C) 2009 Free Software Foundation, Inc.
4
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file bits/decimal.h
26 *  This is an internal header file, included by other library headers.
27 *  You should not attempt to use it directly.
28 */
29
30// ISO/IEC TR 24733
31// Written by Janis Johnson <janis187@us.ibm.com>
32
33#ifndef _GLIBCXX_DECIMAL_IMPL
34#define _GLIBCXX_DECIMAL_IMPL 1
35
36#pragma GCC system_header
37
38namespace std
39{
40namespace decimal
41{
42  // ISO/IEC TR 24733  3.2.[234].1  Construct/copy/destroy.
43
44  inline decimal32::decimal32(decimal64 __r)	: __val(__r.__getval()) {}
45  inline decimal32::decimal32(decimal128 __r)	: __val(__r.__getval()) {}
46  inline decimal64::decimal64(decimal32 __r)	: __val(__r.__getval()) {}
47  inline decimal64::decimal64(decimal128 __r)	: __val(__r.__getval()) {}
48  inline decimal128::decimal128(decimal32 __r)	: __val(__r.__getval()) {}
49  inline decimal128::decimal128(decimal64 __r)	: __val(__r.__getval()) {}
50
51  // ISO/IEC TR 24733  3.2.[234].6  Compound assignment.
52
53#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, _T2)	 \
54  inline _T1& _T1::operator _Op1(_T2 __rhs)				 \
55  {									 \
56    __setval(__getval() _Op2 __rhs.__getval());				 \
57    return *this;							 \
58  }
59
60#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, _T2)	 \
61  inline _T1& _T1::operator _Op1(_T2 __rhs)				 \
62  {									 \
63    __setval(__getval() _Op2 __rhs);					 \
64    return *this;							 \
65  }
66
67#define _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(_Op1, _Op2, _T1)		 \
68  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, decimal32)	 \
69  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, decimal64)	 \
70  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC(_Op1, _Op2, _T1, decimal128)	 \
71  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, int)		 \
72  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, unsigned int) \
73  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, long)	 \
74  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, unsigned long)\
75  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, long long)	 \
76  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT(_Op1, _Op2, _T1, unsigned long long)
77
78  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(+=, +, decimal32)
79  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(-=, -, decimal32)
80  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(*=, *, decimal32)
81  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(/=, /, decimal32)
82
83  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(+=, +, decimal64)
84  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(-=, -, decimal64)
85  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(*=, *, decimal64)
86  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(/=, /, decimal64)
87
88  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(+=, +, decimal128)
89  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(-=, -, decimal128)
90  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(*=, *, decimal128)
91  _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS(/=, /, decimal128)
92
93#undef _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_DEC
94#undef _DEFINE_DECIMAL_COMPOUND_ASSIGNMENT_INT
95#undef _DEFINE_DECIMAL_COMPOUND_ASSIGNMENTS
96
97  // Extension: Conversion to integral type.
98
99  inline long long decimal32_to_long_long(decimal32 __d)
100  { return (long long)__d.__getval(); }
101
102  inline long long decimal64_to_long_long(decimal64 __d)
103  { return (long long)__d.__getval(); }
104
105  inline long long decimal128_to_long_long(decimal128 __d)
106  { return (long long)__d.__getval(); }
107
108  inline long long decimal_to_long_long(decimal32 __d)
109  { return (long long)__d.__getval(); }
110
111  inline long long decimal_to_long_long(decimal64 __d)
112  { return (long long)__d.__getval(); }
113
114  inline long long decimal_to_long_long(decimal128 __d)
115  { return (long long)__d.__getval(); }
116
117  // ISO/IEC TR 24733  3.2.5  Initialization from coefficient and exponent.
118
119  static decimal32 make_decimal32(long long __coeff, int __exponent)
120  {
121    decimal32 __decexp = 1, __multiplier;
122
123    if (__exponent < 0)
124      {
125	__multiplier = 1.E-1DF;
126	__exponent = -__exponent;
127      }
128    else
129      __multiplier = 1.E1DF;
130
131    for (int __i = 0; __i < __exponent; ++__i)
132      __decexp *= __multiplier;
133
134    return __coeff * __decexp;
135  }
136
137  static decimal32 make_decimal32(unsigned long long __coeff, int __exponent)
138  {
139    decimal32 __decexp = 1, __multiplier;
140
141    if (__exponent < 0)
142      {
143	__multiplier = 1.E-1DF;
144	__exponent = -__exponent;
145      }
146    else
147      __multiplier = 1.E1DF;
148
149    for (int __i = 0; __i < __exponent; ++__i)
150      __decexp *= __multiplier;
151
152    return __coeff * __decexp;
153  }
154
155  static decimal64 make_decimal64(long long __coeff, int __exponent)
156  {
157    decimal64 __decexp = 1, __multiplier;
158
159    if (__exponent < 0)
160      {
161	__multiplier = 1.E-1DD;
162	__exponent = -__exponent;
163      }
164    else
165      __multiplier = 1.E1DD;
166
167    for (int __i = 0; __i < __exponent; ++__i)
168      __decexp *= __multiplier;
169
170    return __coeff * __decexp;
171  }
172
173  static decimal64 make_decimal64(unsigned long long __coeff, int __exponent)
174  {
175    decimal64 __decexp = 1, __multiplier;
176
177    if (__exponent < 0)
178      {
179	__multiplier = 1.E-1DD;
180	__exponent = -__exponent;
181      }
182    else
183      __multiplier = 1.E1DD;
184
185    for (int __i = 0; __i < __exponent; ++__i)
186      __decexp *= __multiplier;
187
188    return __coeff * __decexp;
189  }
190
191  static decimal128 make_decimal128(long long __coeff, int __exponent)
192  {
193    decimal128 __decexp = 1, __multiplier;
194
195    if (__exponent < 0)
196      {
197	__multiplier = 1.E-1DL;
198	__exponent = -__exponent;
199      }
200    else
201      __multiplier = 1.E1DL;
202
203    for (int __i = 0; __i < __exponent; ++__i)
204      __decexp *= __multiplier;
205
206    return __coeff * __decexp;
207  }
208
209  static decimal128 make_decimal128(unsigned long long __coeff, int __exponent)
210  {
211    decimal128 __decexp = 1, __multiplier;
212
213    if (__exponent < 0)
214      {
215	__multiplier = 1.E-1DL;
216	__exponent = -__exponent;
217      }
218    else
219      __multiplier = 1.E1DL;
220
221    for (int __i = 0; __i < __exponent; ++__i)
222      __decexp *= __multiplier;
223
224    return __coeff * __decexp;
225  }
226
227  // ISO/IEC TR 24733  3.2.6  Conversion to generic floating-point type.
228
229  inline float decimal32_to_float(decimal32 __d)
230  { return (float)__d.__getval(); }
231
232  inline float decimal64_to_float(decimal64 __d)
233  { return (float)__d.__getval(); }
234
235  inline float decimal128_to_float(decimal128 __d)
236  { return (float)__d.__getval(); }
237
238  inline float decimal_to_float(decimal32 __d)
239  { return (float)__d.__getval(); }
240
241  inline float decimal_to_float(decimal64 __d)
242  { return (float)__d.__getval(); }
243
244  inline float decimal_to_float(decimal128 __d)
245  { return (float)__d.__getval(); }
246
247  inline double decimal32_to_double(decimal32 __d)
248  { return (double)__d.__getval(); }
249
250  inline double decimal64_to_double(decimal64 __d)
251  { return (double)__d.__getval(); }
252
253  inline double decimal128_to_double(decimal128 __d)
254  { return (double)__d.__getval(); }
255
256  inline double decimal_to_double(decimal32 __d)
257  { return (double)__d.__getval(); }
258
259  inline double decimal_to_double(decimal64 __d)
260  { return (double)__d.__getval(); }
261
262  inline double decimal_to_double(decimal128 __d)
263  { return (double)__d.__getval(); }
264
265  inline long double decimal32_to_long_double(decimal32 __d)
266  { return (long double)__d.__getval(); }
267
268  inline long double decimal64_to_long_double(decimal64 __d)
269  { return (long double)__d.__getval(); }
270
271  inline long double decimal128_to_long_double(decimal128 __d)
272  { return (long double)__d.__getval(); }
273
274  inline long double decimal_to_long_double(decimal32 __d)
275  { return (long double)__d.__getval(); }
276
277  inline long double decimal_to_long_double(decimal64 __d)
278  { return (long double)__d.__getval(); }
279
280  inline long double decimal_to_long_double(decimal128 __d)
281  { return (long double)__d.__getval(); }
282
283  // ISO/IEC TR 24733  3.2.7  Unary arithmetic operators.
284
285#define _DEFINE_DECIMAL_UNARY_OP(_Op, _Tp)	\
286  inline _Tp operator _Op(_Tp __rhs)		\
287  {						\
288    _Tp __tmp;					\
289    __tmp.__setval(0 _Op __rhs.__getval());	\
290    return __tmp;				\
291  }
292
293  _DEFINE_DECIMAL_UNARY_OP(+, decimal32)
294  _DEFINE_DECIMAL_UNARY_OP(+, decimal64)
295  _DEFINE_DECIMAL_UNARY_OP(+, decimal128)
296  _DEFINE_DECIMAL_UNARY_OP(-, decimal32)
297  _DEFINE_DECIMAL_UNARY_OP(-, decimal64)
298  _DEFINE_DECIMAL_UNARY_OP(-, decimal128)
299
300#undef _DEFINE_DECIMAL_UNARY_OP
301
302  // ISO/IEC TR 24733  3.2.8  Binary arithmetic operators.
303
304#define _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(_Op, _T1, _T2, _T3)	\
305  inline _T1 operator _Op(_T2 __lhs, _T3 __rhs)			\
306  {								\
307    _T1 __retval;						\
308    __retval.__setval(__lhs.__getval() _Op __rhs.__getval());	\
309    return __retval;						\
310  }
311
312#define _DEFINE_DECIMAL_BINARY_OP_BOTH(_Op, _T1, _T2, _T3)	\
313  inline _T1 operator _Op(_T2 __lhs, _T3 __rhs)			\
314  {								\
315    _T1 __retval;						\
316    __retval.__setval(__lhs.__getval() _Op __rhs.__getval());	\
317    return __retval;						\
318  }
319
320#define _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, _T2)		\
321  inline _T1 operator _Op(_T1 __lhs, _T2 __rhs)			\
322  {								\
323    _T1 __retval;						\
324    __retval.__setval(__lhs.__getval() _Op __rhs);		\
325    return __retval;						\
326  }
327
328#define _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, _T2)		\
329  inline _T1 operator _Op(_T2 __lhs, _T1 __rhs)			\
330  {								\
331    _T1 __retval;						\
332    __retval.__setval(__lhs _Op __rhs.__getval());		\
333    return __retval;						\
334  }
335
336#define _DEFINE_DECIMAL_BINARY_OP_WITH_INT(_Op, _T1)		\
337  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, int);			\
338  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, unsigned int);	\
339  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, long);		\
340  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, unsigned long);	\
341  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, long long);		\
342  _DEFINE_DECIMAL_BINARY_OP_LHS(_Op, _T1, unsigned long long);	\
343  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, int);			\
344  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, unsigned int);	\
345  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, long);		\
346  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, unsigned long);	\
347  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, long long);		\
348  _DEFINE_DECIMAL_BINARY_OP_RHS(_Op, _T1, unsigned long long);	\
349
350  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal32, decimal32, decimal32)
351  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(+, decimal32)
352  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal32, decimal64)
353  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal64, decimal32)
354  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal64, decimal64)
355  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(+, decimal64)
356  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal32, decimal128)
357  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal64, decimal128)
358  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal32)
359  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal64)
360  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal128)
361  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(+, decimal128)
362
363  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal32, decimal32, decimal32)
364  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(-, decimal32)
365  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal32, decimal64)
366  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal64, decimal32)
367  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal64, decimal64)
368  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(-, decimal64)
369  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal32, decimal128)
370  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal64, decimal128)
371  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal32)
372  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal64)
373  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal128)
374  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(-, decimal128)
375
376  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal32, decimal32, decimal32)
377  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(*, decimal32)
378  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal32, decimal64)
379  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal64, decimal32)
380  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal64, decimal64)
381  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(*, decimal64)
382  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal32, decimal128)
383  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal64, decimal128)
384  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal32)
385  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal64)
386  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal128)
387  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(*, decimal128)
388
389  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal32, decimal32, decimal32)
390  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(/, decimal32)
391  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal32, decimal64)
392  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal64, decimal32)
393  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal64, decimal64)
394  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(/, decimal64)
395  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal32, decimal128)
396  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal64, decimal128)
397  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal32)
398  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal64)
399  _DEFINE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal128)
400  _DEFINE_DECIMAL_BINARY_OP_WITH_INT(/, decimal128)
401
402#undef _DEFINE_DECIMAL_BINARY_OP_WITH_DEC
403#undef _DEFINE_DECIMAL_BINARY_OP_BOTH
404#undef _DEFINE_DECIMAL_BINARY_OP_LHS
405#undef _DEFINE_DECIMAL_BINARY_OP_RHS
406#undef _DEFINE_DECIMAL_BINARY_OP_WITH_INT
407
408  // ISO/IEC TR 24733  3.2.9  Comparison operators.
409
410#define _DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _T1, _T2)	\
411  inline bool operator _Op(_T1 __lhs, _T2 __rhs)	\
412  { return __lhs.__getval() _Op __rhs.__getval(); }
413
414#define _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _T1, _T2)	\
415  inline bool operator _Op(_T1 __lhs, _T2 __rhs)	\
416  { return __lhs.__getval() _Op __rhs; }
417
418#define _DEFINE_DECIMAL_COMPARISON_RHS(_Op, _T1, _T2)	\
419  inline bool operator _Op(_T1 __lhs, _T2 __rhs)	\
420  { return __lhs _Op __rhs.__getval(); }
421
422#define _DEFINE_DECIMAL_COMPARISONS(_Op, _Tp)			\
423  _DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _Tp, decimal32)		\
424  _DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _Tp, decimal64)		\
425  _DEFINE_DECIMAL_COMPARISON_BOTH(_Op, _Tp, decimal128)		\
426  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, int)			\
427  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, unsigned int)	\
428  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, long)		\
429  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, unsigned long)	\
430  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, long long)		\
431  _DEFINE_DECIMAL_COMPARISON_LHS(_Op, _Tp, unsigned long long)	\
432  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, int, _Tp)			\
433  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, unsigned int, _Tp)	\
434  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, long, _Tp)		\
435  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, unsigned long, _Tp)	\
436  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, long long, _Tp)		\
437  _DEFINE_DECIMAL_COMPARISON_RHS(_Op, unsigned long long, _Tp)
438
439  _DEFINE_DECIMAL_COMPARISONS(==, decimal32)
440  _DEFINE_DECIMAL_COMPARISONS(==, decimal64)
441  _DEFINE_DECIMAL_COMPARISONS(==, decimal128)
442  _DEFINE_DECIMAL_COMPARISONS(!=, decimal32)
443  _DEFINE_DECIMAL_COMPARISONS(!=, decimal64)
444  _DEFINE_DECIMAL_COMPARISONS(!=, decimal128)
445  _DEFINE_DECIMAL_COMPARISONS(<,  decimal32)
446  _DEFINE_DECIMAL_COMPARISONS(<,  decimal64)
447  _DEFINE_DECIMAL_COMPARISONS(<,  decimal128)
448  _DEFINE_DECIMAL_COMPARISONS(<=, decimal32)
449  _DEFINE_DECIMAL_COMPARISONS(<=, decimal64)
450  _DEFINE_DECIMAL_COMPARISONS(<=, decimal128)
451  _DEFINE_DECIMAL_COMPARISONS(>,  decimal32)
452  _DEFINE_DECIMAL_COMPARISONS(>,  decimal64)
453  _DEFINE_DECIMAL_COMPARISONS(>,  decimal128)
454  _DEFINE_DECIMAL_COMPARISONS(>=, decimal32)
455  _DEFINE_DECIMAL_COMPARISONS(>=, decimal64)
456  _DEFINE_DECIMAL_COMPARISONS(>=, decimal128)
457
458#undef _DEFINE_DECIMAL_COMPARISON_BOTH
459#undef _DEFINE_DECIMAL_COMPARISON_LHS
460#undef _DEFINE_DECIMAL_COMPARISON_RHS
461#undef _DEFINE_DECIMAL_COMPARISONS
462
463} // namespace decimal
464} // namespace std
465
466#endif /* _GLIBCXX_DECIMAL_IMPL */
467