annotate libstdc++-v3/include/decimal/decimal @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // <decimal> -*- C++ -*-
kono
parents:
diff changeset
2
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3 // Copyright (C) 2009-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
4 // This file is part of the GNU ISO C++ Library. This library is free
kono
parents:
diff changeset
5 // software; you can redistribute it and/or modify it under the
kono
parents:
diff changeset
6 // terms of the GNU General Public License as published by the
kono
parents:
diff changeset
7 // Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
8 // any later version.
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 // This library is distributed in the hope that it will be useful,
kono
parents:
diff changeset
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents:
diff changeset
13 // GNU General Public License for more details.
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 // Under Section 7 of GPL version 3, you are granted additional
kono
parents:
diff changeset
16 // permissions described in the GCC Runtime Library Exception, version
kono
parents:
diff changeset
17 // 3.1, as published by the Free Software Foundation.
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 // You should have received a copy of the GNU General Public License and
kono
parents:
diff changeset
20 // a copy of the GCC Runtime Library Exception along with this program;
kono
parents:
diff changeset
21 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
kono
parents:
diff changeset
22 // <http://www.gnu.org/licenses/>.
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 /** @file decimal/decimal
kono
parents:
diff changeset
25 * This is a Standard C++ Library header.
kono
parents:
diff changeset
26 */
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 // ISO/IEC TR 24733
kono
parents:
diff changeset
29 // Written by Janis Johnson <janis187@us.ibm.com>
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 #ifndef _GLIBCXX_DECIMAL
kono
parents:
diff changeset
32 #define _GLIBCXX_DECIMAL 1
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 #pragma GCC system_header
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 #include <bits/c++config.h>
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 #ifndef _GLIBCXX_USE_DECIMAL_FLOAT
kono
parents:
diff changeset
39 #error This file requires compiler and library support for ISO/IEC TR 24733 \
kono
parents:
diff changeset
40 that is currently not available.
kono
parents:
diff changeset
41 #endif
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 namespace std _GLIBCXX_VISIBILITY(default)
kono
parents:
diff changeset
44 {
kono
parents:
diff changeset
45 _GLIBCXX_BEGIN_NAMESPACE_VERSION
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 /**
kono
parents:
diff changeset
48 * @defgroup decimal Decimal Floating-Point Arithmetic
kono
parents:
diff changeset
49 * @ingroup numerics
kono
parents:
diff changeset
50 *
kono
parents:
diff changeset
51 * Classes and functions for decimal floating-point arithmetic.
kono
parents:
diff changeset
52 * @{
kono
parents:
diff changeset
53 */
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 /** @namespace std::decimal
kono
parents:
diff changeset
56 * @brief ISO/IEC TR 24733 Decimal floating-point arithmetic.
kono
parents:
diff changeset
57 */
kono
parents:
diff changeset
58 namespace decimal
kono
parents:
diff changeset
59 {
kono
parents:
diff changeset
60 class decimal32;
kono
parents:
diff changeset
61 class decimal64;
kono
parents:
diff changeset
62 class decimal128;
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 // 3.2.5 Initialization from coefficient and exponent.
kono
parents:
diff changeset
65 static decimal32 make_decimal32(long long __coeff, int __exp);
kono
parents:
diff changeset
66 static decimal32 make_decimal32(unsigned long long __coeff, int __exp);
kono
parents:
diff changeset
67 static decimal64 make_decimal64(long long __coeff, int __exp);
kono
parents:
diff changeset
68 static decimal64 make_decimal64(unsigned long long __coeff, int __exp);
kono
parents:
diff changeset
69 static decimal128 make_decimal128(long long __coeff, int __exp);
kono
parents:
diff changeset
70 static decimal128 make_decimal128(unsigned long long __coeff, int __exp);
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 /// Non-conforming extension: Conversion to integral type.
kono
parents:
diff changeset
73 long long decimal32_to_long_long(decimal32 __d);
kono
parents:
diff changeset
74 long long decimal64_to_long_long(decimal64 __d);
kono
parents:
diff changeset
75 long long decimal128_to_long_long(decimal128 __d);
kono
parents:
diff changeset
76 long long decimal_to_long_long(decimal32 __d);
kono
parents:
diff changeset
77 long long decimal_to_long_long(decimal64 __d);
kono
parents:
diff changeset
78 long long decimal_to_long_long(decimal128 __d);
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 // 3.2.6 Conversion to generic floating-point type.
kono
parents:
diff changeset
81 float decimal32_to_float(decimal32 __d);
kono
parents:
diff changeset
82 float decimal64_to_float(decimal64 __d);
kono
parents:
diff changeset
83 float decimal128_to_float(decimal128 __d);
kono
parents:
diff changeset
84 float decimal_to_float(decimal32 __d);
kono
parents:
diff changeset
85 float decimal_to_float(decimal64 __d);
kono
parents:
diff changeset
86 float decimal_to_float(decimal128 __d);
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 double decimal32_to_double(decimal32 __d);
kono
parents:
diff changeset
89 double decimal64_to_double(decimal64 __d);
kono
parents:
diff changeset
90 double decimal128_to_double(decimal128 __d);
kono
parents:
diff changeset
91 double decimal_to_double(decimal32 __d);
kono
parents:
diff changeset
92 double decimal_to_double(decimal64 __d);
kono
parents:
diff changeset
93 double decimal_to_double(decimal128 __d);
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 long double decimal32_to_long_double(decimal32 __d);
kono
parents:
diff changeset
96 long double decimal64_to_long_double(decimal64 __d);
kono
parents:
diff changeset
97 long double decimal128_to_long_double(decimal128 __d);
kono
parents:
diff changeset
98 long double decimal_to_long_double(decimal32 __d);
kono
parents:
diff changeset
99 long double decimal_to_long_double(decimal64 __d);
kono
parents:
diff changeset
100 long double decimal_to_long_double(decimal128 __d);
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 // 3.2.7 Unary arithmetic operators.
kono
parents:
diff changeset
103 decimal32 operator+(decimal32 __rhs);
kono
parents:
diff changeset
104 decimal64 operator+(decimal64 __rhs);
kono
parents:
diff changeset
105 decimal128 operator+(decimal128 __rhs);
kono
parents:
diff changeset
106 decimal32 operator-(decimal32 __rhs);
kono
parents:
diff changeset
107 decimal64 operator-(decimal64 __rhs);
kono
parents:
diff changeset
108 decimal128 operator-(decimal128 __rhs);
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 // 3.2.8 Binary arithmetic operators.
kono
parents:
diff changeset
111 #define _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(_Op, _T1, _T2, _T3) \
kono
parents:
diff changeset
112 _T1 operator _Op(_T2 __lhs, _T3 __rhs);
kono
parents:
diff changeset
113 #define _DECLARE_DECIMAL_BINARY_OP_WITH_INT(_Op, _Tp) \
kono
parents:
diff changeset
114 _Tp operator _Op(_Tp __lhs, int __rhs); \
kono
parents:
diff changeset
115 _Tp operator _Op(_Tp __lhs, unsigned int __rhs); \
kono
parents:
diff changeset
116 _Tp operator _Op(_Tp __lhs, long __rhs); \
kono
parents:
diff changeset
117 _Tp operator _Op(_Tp __lhs, unsigned long __rhs); \
kono
parents:
diff changeset
118 _Tp operator _Op(_Tp __lhs, long long __rhs); \
kono
parents:
diff changeset
119 _Tp operator _Op(_Tp __lhs, unsigned long long __rhs); \
kono
parents:
diff changeset
120 _Tp operator _Op(int __lhs, _Tp __rhs); \
kono
parents:
diff changeset
121 _Tp operator _Op(unsigned int __lhs, _Tp __rhs); \
kono
parents:
diff changeset
122 _Tp operator _Op(long __lhs, _Tp __rhs); \
kono
parents:
diff changeset
123 _Tp operator _Op(unsigned long __lhs, _Tp __rhs); \
kono
parents:
diff changeset
124 _Tp operator _Op(long long __lhs, _Tp __rhs); \
kono
parents:
diff changeset
125 _Tp operator _Op(unsigned long long __lhs, _Tp __rhs);
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal32, decimal32, decimal32)
kono
parents:
diff changeset
128 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(+, decimal32)
kono
parents:
diff changeset
129 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal32, decimal64)
kono
parents:
diff changeset
130 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal64, decimal32)
kono
parents:
diff changeset
131 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal64, decimal64, decimal64)
kono
parents:
diff changeset
132 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(+, decimal64)
kono
parents:
diff changeset
133 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal32, decimal128)
kono
parents:
diff changeset
134 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal64, decimal128)
kono
parents:
diff changeset
135 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal32)
kono
parents:
diff changeset
136 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal64)
kono
parents:
diff changeset
137 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(+, decimal128, decimal128, decimal128)
kono
parents:
diff changeset
138 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(+, decimal128)
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal32, decimal32, decimal32)
kono
parents:
diff changeset
141 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(-, decimal32)
kono
parents:
diff changeset
142 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal32, decimal64)
kono
parents:
diff changeset
143 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal64, decimal32)
kono
parents:
diff changeset
144 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal64, decimal64, decimal64)
kono
parents:
diff changeset
145 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(-, decimal64)
kono
parents:
diff changeset
146 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal32, decimal128)
kono
parents:
diff changeset
147 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal64, decimal128)
kono
parents:
diff changeset
148 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal32)
kono
parents:
diff changeset
149 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal64)
kono
parents:
diff changeset
150 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(-, decimal128, decimal128, decimal128)
kono
parents:
diff changeset
151 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(-, decimal128)
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal32, decimal32, decimal32)
kono
parents:
diff changeset
154 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(*, decimal32)
kono
parents:
diff changeset
155 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal32, decimal64)
kono
parents:
diff changeset
156 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal64, decimal32)
kono
parents:
diff changeset
157 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal64, decimal64, decimal64)
kono
parents:
diff changeset
158 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(*, decimal64)
kono
parents:
diff changeset
159 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal32, decimal128)
kono
parents:
diff changeset
160 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal64, decimal128)
kono
parents:
diff changeset
161 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal32)
kono
parents:
diff changeset
162 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal64)
kono
parents:
diff changeset
163 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(*, decimal128, decimal128, decimal128)
kono
parents:
diff changeset
164 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(*, decimal128)
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal32, decimal32, decimal32)
kono
parents:
diff changeset
167 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(/, decimal32)
kono
parents:
diff changeset
168 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal32, decimal64)
kono
parents:
diff changeset
169 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal64, decimal32)
kono
parents:
diff changeset
170 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal64, decimal64, decimal64)
kono
parents:
diff changeset
171 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(/, decimal64)
kono
parents:
diff changeset
172 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal32, decimal128)
kono
parents:
diff changeset
173 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal64, decimal128)
kono
parents:
diff changeset
174 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal32)
kono
parents:
diff changeset
175 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal64)
kono
parents:
diff changeset
176 _DECLARE_DECIMAL_BINARY_OP_WITH_DEC(/, decimal128, decimal128, decimal128)
kono
parents:
diff changeset
177 _DECLARE_DECIMAL_BINARY_OP_WITH_INT(/, decimal128)
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 #undef _DECLARE_DECIMAL_BINARY_OP_WITH_DEC
kono
parents:
diff changeset
180 #undef _DECLARE_DECIMAL_BINARY_OP_WITH_INT
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 // 3.2.9 Comparison operators.
kono
parents:
diff changeset
183 #define _DECLARE_DECIMAL_COMPARISON(_Op, _Tp) \
kono
parents:
diff changeset
184 bool operator _Op(_Tp __lhs, decimal32 __rhs); \
kono
parents:
diff changeset
185 bool operator _Op(_Tp __lhs, decimal64 __rhs); \
kono
parents:
diff changeset
186 bool operator _Op(_Tp __lhs, decimal128 __rhs); \
kono
parents:
diff changeset
187 bool operator _Op(_Tp __lhs, int __rhs); \
kono
parents:
diff changeset
188 bool operator _Op(_Tp __lhs, unsigned int __rhs); \
kono
parents:
diff changeset
189 bool operator _Op(_Tp __lhs, long __rhs); \
kono
parents:
diff changeset
190 bool operator _Op(_Tp __lhs, unsigned long __rhs); \
kono
parents:
diff changeset
191 bool operator _Op(_Tp __lhs, long long __rhs); \
kono
parents:
diff changeset
192 bool operator _Op(_Tp __lhs, unsigned long long __rhs); \
kono
parents:
diff changeset
193 bool operator _Op(int __lhs, _Tp __rhs); \
kono
parents:
diff changeset
194 bool operator _Op(unsigned int __lhs, _Tp __rhs); \
kono
parents:
diff changeset
195 bool operator _Op(long __lhs, _Tp __rhs); \
kono
parents:
diff changeset
196 bool operator _Op(unsigned long __lhs, _Tp __rhs); \
kono
parents:
diff changeset
197 bool operator _Op(long long __lhs, _Tp __rhs); \
kono
parents:
diff changeset
198 bool operator _Op(unsigned long long __lhs, _Tp __rhs);
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 _DECLARE_DECIMAL_COMPARISON(==, decimal32)
kono
parents:
diff changeset
201 _DECLARE_DECIMAL_COMPARISON(==, decimal64)
kono
parents:
diff changeset
202 _DECLARE_DECIMAL_COMPARISON(==, decimal128)
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 _DECLARE_DECIMAL_COMPARISON(!=, decimal32)
kono
parents:
diff changeset
205 _DECLARE_DECIMAL_COMPARISON(!=, decimal64)
kono
parents:
diff changeset
206 _DECLARE_DECIMAL_COMPARISON(!=, decimal128)
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 _DECLARE_DECIMAL_COMPARISON(<, decimal32)
kono
parents:
diff changeset
209 _DECLARE_DECIMAL_COMPARISON(<, decimal64)
kono
parents:
diff changeset
210 _DECLARE_DECIMAL_COMPARISON(<, decimal128)
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 _DECLARE_DECIMAL_COMPARISON(>=, decimal32)
kono
parents:
diff changeset
213 _DECLARE_DECIMAL_COMPARISON(>=, decimal64)
kono
parents:
diff changeset
214 _DECLARE_DECIMAL_COMPARISON(>=, decimal128)
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 _DECLARE_DECIMAL_COMPARISON(>, decimal32)
kono
parents:
diff changeset
217 _DECLARE_DECIMAL_COMPARISON(>, decimal64)
kono
parents:
diff changeset
218 _DECLARE_DECIMAL_COMPARISON(>, decimal128)
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 _DECLARE_DECIMAL_COMPARISON(>=, decimal32)
kono
parents:
diff changeset
221 _DECLARE_DECIMAL_COMPARISON(>=, decimal64)
kono
parents:
diff changeset
222 _DECLARE_DECIMAL_COMPARISON(>=, decimal128)
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 #undef _DECLARE_DECIMAL_COMPARISON
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 /// 3.2.2 Class decimal32.
kono
parents:
diff changeset
227 class decimal32
kono
parents:
diff changeset
228 {
kono
parents:
diff changeset
229 public:
kono
parents:
diff changeset
230 typedef float __decfloat32 __attribute__((mode(SD)));
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 // 3.2.2.2 Construct/copy/destroy.
kono
parents:
diff changeset
233 decimal32() : __val(0.e-101DF) {}
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 // 3.2.2.3 Conversion from floating-point type.
kono
parents:
diff changeset
236 explicit decimal32(decimal64 __d64);
kono
parents:
diff changeset
237 explicit decimal32(decimal128 __d128);
kono
parents:
diff changeset
238 explicit decimal32(float __r) : __val(__r) {}
kono
parents:
diff changeset
239 explicit decimal32(double __r) : __val(__r) {}
kono
parents:
diff changeset
240 explicit decimal32(long double __r) : __val(__r) {}
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 // 3.2.2.4 Conversion from integral type.
kono
parents:
diff changeset
243 decimal32(int __z) : __val(__z) {}
kono
parents:
diff changeset
244 decimal32(unsigned int __z) : __val(__z) {}
kono
parents:
diff changeset
245 decimal32(long __z) : __val(__z) {}
kono
parents:
diff changeset
246 decimal32(unsigned long __z) : __val(__z) {}
kono
parents:
diff changeset
247 decimal32(long long __z) : __val(__z) {}
kono
parents:
diff changeset
248 decimal32(unsigned long long __z) : __val(__z) {}
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 /// Conforming extension: Conversion from scalar decimal type.
kono
parents:
diff changeset
251 decimal32(__decfloat32 __z) : __val(__z) {}
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 #if __cplusplus >= 201103L
kono
parents:
diff changeset
254 // 3.2.2.5 Conversion to integral type.
kono
parents:
diff changeset
255 // Note: explicit per n3407.
kono
parents:
diff changeset
256 explicit operator long long() const { return (long long)__val; }
kono
parents:
diff changeset
257 #endif
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 // 3.2.2.6 Increment and decrement operators.
kono
parents:
diff changeset
260 decimal32& operator++()
kono
parents:
diff changeset
261 {
kono
parents:
diff changeset
262 __val += 1;
kono
parents:
diff changeset
263 return *this;
kono
parents:
diff changeset
264 }
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 decimal32 operator++(int)
kono
parents:
diff changeset
267 {
kono
parents:
diff changeset
268 decimal32 __tmp = *this;
kono
parents:
diff changeset
269 __val += 1;
kono
parents:
diff changeset
270 return __tmp;
kono
parents:
diff changeset
271 }
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 decimal32& operator--()
kono
parents:
diff changeset
274 {
kono
parents:
diff changeset
275 __val -= 1;
kono
parents:
diff changeset
276 return *this;
kono
parents:
diff changeset
277 }
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 decimal32 operator--(int)
kono
parents:
diff changeset
280 {
kono
parents:
diff changeset
281 decimal32 __tmp = *this;
kono
parents:
diff changeset
282 __val -= 1;
kono
parents:
diff changeset
283 return __tmp;
kono
parents:
diff changeset
284 }
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 // 3.2.2.7 Compound assignment.
kono
parents:
diff changeset
287 #define _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT(_Op) \
kono
parents:
diff changeset
288 decimal32& operator _Op(decimal32 __rhs); \
kono
parents:
diff changeset
289 decimal32& operator _Op(decimal64 __rhs); \
kono
parents:
diff changeset
290 decimal32& operator _Op(decimal128 __rhs); \
kono
parents:
diff changeset
291 decimal32& operator _Op(int __rhs); \
kono
parents:
diff changeset
292 decimal32& operator _Op(unsigned int __rhs); \
kono
parents:
diff changeset
293 decimal32& operator _Op(long __rhs); \
kono
parents:
diff changeset
294 decimal32& operator _Op(unsigned long __rhs); \
kono
parents:
diff changeset
295 decimal32& operator _Op(long long __rhs); \
kono
parents:
diff changeset
296 decimal32& operator _Op(unsigned long long __rhs);
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT(+=)
kono
parents:
diff changeset
299 _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT(-=)
kono
parents:
diff changeset
300 _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT(*=)
kono
parents:
diff changeset
301 _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT(/=)
kono
parents:
diff changeset
302 #undef _DECLARE_DECIMAL32_COMPOUND_ASSIGNMENT
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 private:
kono
parents:
diff changeset
305 __decfloat32 __val;
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 public:
kono
parents:
diff changeset
308 __decfloat32 __getval(void) { return __val; }
kono
parents:
diff changeset
309 void __setval(__decfloat32 __x) { __val = __x; }
kono
parents:
diff changeset
310 };
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 /// 3.2.3 Class decimal64.
kono
parents:
diff changeset
313 class decimal64
kono
parents:
diff changeset
314 {
kono
parents:
diff changeset
315 public:
kono
parents:
diff changeset
316 typedef float __decfloat64 __attribute__((mode(DD)));
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 // 3.2.3.2 Construct/copy/destroy.
kono
parents:
diff changeset
319 decimal64() : __val(0.e-398dd) {}
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 // 3.2.3.3 Conversion from floating-point type.
kono
parents:
diff changeset
322 decimal64(decimal32 d32);
kono
parents:
diff changeset
323 explicit decimal64(decimal128 d128);
kono
parents:
diff changeset
324 explicit decimal64(float __r) : __val(__r) {}
kono
parents:
diff changeset
325 explicit decimal64(double __r) : __val(__r) {}
kono
parents:
diff changeset
326 explicit decimal64(long double __r) : __val(__r) {}
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 // 3.2.3.4 Conversion from integral type.
kono
parents:
diff changeset
329 decimal64(int __z) : __val(__z) {}
kono
parents:
diff changeset
330 decimal64(unsigned int __z) : __val(__z) {}
kono
parents:
diff changeset
331 decimal64(long __z) : __val(__z) {}
kono
parents:
diff changeset
332 decimal64(unsigned long __z) : __val(__z) {}
kono
parents:
diff changeset
333 decimal64(long long __z) : __val(__z) {}
kono
parents:
diff changeset
334 decimal64(unsigned long long __z) : __val(__z) {}
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 /// Conforming extension: Conversion from scalar decimal type.
kono
parents:
diff changeset
337 decimal64(__decfloat64 __z) : __val(__z) {}
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 #if __cplusplus >= 201103L
kono
parents:
diff changeset
340 // 3.2.3.5 Conversion to integral type.
kono
parents:
diff changeset
341 // Note: explicit per n3407.
kono
parents:
diff changeset
342 explicit operator long long() const { return (long long)__val; }
kono
parents:
diff changeset
343 #endif
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 // 3.2.3.6 Increment and decrement operators.
kono
parents:
diff changeset
346 decimal64& operator++()
kono
parents:
diff changeset
347 {
kono
parents:
diff changeset
348 __val += 1;
kono
parents:
diff changeset
349 return *this;
kono
parents:
diff changeset
350 }
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 decimal64 operator++(int)
kono
parents:
diff changeset
353 {
kono
parents:
diff changeset
354 decimal64 __tmp = *this;
kono
parents:
diff changeset
355 __val += 1;
kono
parents:
diff changeset
356 return __tmp;
kono
parents:
diff changeset
357 }
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 decimal64& operator--()
kono
parents:
diff changeset
360 {
kono
parents:
diff changeset
361 __val -= 1;
kono
parents:
diff changeset
362 return *this;
kono
parents:
diff changeset
363 }
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 decimal64 operator--(int)
kono
parents:
diff changeset
366 {
kono
parents:
diff changeset
367 decimal64 __tmp = *this;
kono
parents:
diff changeset
368 __val -= 1;
kono
parents:
diff changeset
369 return __tmp;
kono
parents:
diff changeset
370 }
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 // 3.2.3.7 Compound assignment.
kono
parents:
diff changeset
373 #define _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT(_Op) \
kono
parents:
diff changeset
374 decimal64& operator _Op(decimal32 __rhs); \
kono
parents:
diff changeset
375 decimal64& operator _Op(decimal64 __rhs); \
kono
parents:
diff changeset
376 decimal64& operator _Op(decimal128 __rhs); \
kono
parents:
diff changeset
377 decimal64& operator _Op(int __rhs); \
kono
parents:
diff changeset
378 decimal64& operator _Op(unsigned int __rhs); \
kono
parents:
diff changeset
379 decimal64& operator _Op(long __rhs); \
kono
parents:
diff changeset
380 decimal64& operator _Op(unsigned long __rhs); \
kono
parents:
diff changeset
381 decimal64& operator _Op(long long __rhs); \
kono
parents:
diff changeset
382 decimal64& operator _Op(unsigned long long __rhs);
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT(+=)
kono
parents:
diff changeset
385 _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT(-=)
kono
parents:
diff changeset
386 _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT(*=)
kono
parents:
diff changeset
387 _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT(/=)
kono
parents:
diff changeset
388 #undef _DECLARE_DECIMAL64_COMPOUND_ASSIGNMENT
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 private:
kono
parents:
diff changeset
391 __decfloat64 __val;
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 public:
kono
parents:
diff changeset
394 __decfloat64 __getval(void) { return __val; }
kono
parents:
diff changeset
395 void __setval(__decfloat64 __x) { __val = __x; }
kono
parents:
diff changeset
396 };
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 /// 3.2.4 Class decimal128.
kono
parents:
diff changeset
399 class decimal128
kono
parents:
diff changeset
400 {
kono
parents:
diff changeset
401 public:
kono
parents:
diff changeset
402 typedef float __decfloat128 __attribute__((mode(TD)));
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 // 3.2.4.2 Construct/copy/destroy.
kono
parents:
diff changeset
405 decimal128() : __val(0.e-6176DL) {}
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 // 3.2.4.3 Conversion from floating-point type.
kono
parents:
diff changeset
408 decimal128(decimal32 d32);
kono
parents:
diff changeset
409 decimal128(decimal64 d64);
kono
parents:
diff changeset
410 explicit decimal128(float __r) : __val(__r) {}
kono
parents:
diff changeset
411 explicit decimal128(double __r) : __val(__r) {}
kono
parents:
diff changeset
412 explicit decimal128(long double __r) : __val(__r) {}
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414
kono
parents:
diff changeset
415 // 3.2.4.4 Conversion from integral type.
kono
parents:
diff changeset
416 decimal128(int __z) : __val(__z) {}
kono
parents:
diff changeset
417 decimal128(unsigned int __z) : __val(__z) {}
kono
parents:
diff changeset
418 decimal128(long __z) : __val(__z) {}
kono
parents:
diff changeset
419 decimal128(unsigned long __z) : __val(__z) {}
kono
parents:
diff changeset
420 decimal128(long long __z) : __val(__z) {}
kono
parents:
diff changeset
421 decimal128(unsigned long long __z) : __val(__z) {}
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 /// Conforming extension: Conversion from scalar decimal type.
kono
parents:
diff changeset
424 decimal128(__decfloat128 __z) : __val(__z) {}
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 #if __cplusplus >= 201103L
kono
parents:
diff changeset
427 // 3.2.4.5 Conversion to integral type.
kono
parents:
diff changeset
428 // Note: explicit per n3407.
kono
parents:
diff changeset
429 explicit operator long long() const { return (long long)__val; }
kono
parents:
diff changeset
430 #endif
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 // 3.2.4.6 Increment and decrement operators.
kono
parents:
diff changeset
433 decimal128& operator++()
kono
parents:
diff changeset
434 {
kono
parents:
diff changeset
435 __val += 1;
kono
parents:
diff changeset
436 return *this;
kono
parents:
diff changeset
437 }
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 decimal128 operator++(int)
kono
parents:
diff changeset
440 {
kono
parents:
diff changeset
441 decimal128 __tmp = *this;
kono
parents:
diff changeset
442 __val += 1;
kono
parents:
diff changeset
443 return __tmp;
kono
parents:
diff changeset
444 }
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 decimal128& operator--()
kono
parents:
diff changeset
447 {
kono
parents:
diff changeset
448 __val -= 1;
kono
parents:
diff changeset
449 return *this;
kono
parents:
diff changeset
450 }
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 decimal128 operator--(int)
kono
parents:
diff changeset
453 {
kono
parents:
diff changeset
454 decimal128 __tmp = *this;
kono
parents:
diff changeset
455 __val -= 1;
kono
parents:
diff changeset
456 return __tmp;
kono
parents:
diff changeset
457 }
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 // 3.2.4.7 Compound assignment.
kono
parents:
diff changeset
460 #define _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT(_Op) \
kono
parents:
diff changeset
461 decimal128& operator _Op(decimal32 __rhs); \
kono
parents:
diff changeset
462 decimal128& operator _Op(decimal64 __rhs); \
kono
parents:
diff changeset
463 decimal128& operator _Op(decimal128 __rhs); \
kono
parents:
diff changeset
464 decimal128& operator _Op(int __rhs); \
kono
parents:
diff changeset
465 decimal128& operator _Op(unsigned int __rhs); \
kono
parents:
diff changeset
466 decimal128& operator _Op(long __rhs); \
kono
parents:
diff changeset
467 decimal128& operator _Op(unsigned long __rhs); \
kono
parents:
diff changeset
468 decimal128& operator _Op(long long __rhs); \
kono
parents:
diff changeset
469 decimal128& operator _Op(unsigned long long __rhs);
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT(+=)
kono
parents:
diff changeset
472 _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT(-=)
kono
parents:
diff changeset
473 _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT(*=)
kono
parents:
diff changeset
474 _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT(/=)
kono
parents:
diff changeset
475 #undef _DECLARE_DECIMAL128_COMPOUND_ASSIGNMENT
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 private:
kono
parents:
diff changeset
478 __decfloat128 __val;
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 public:
kono
parents:
diff changeset
481 __decfloat128 __getval(void) { return __val; }
kono
parents:
diff changeset
482 void __setval(__decfloat128 __x) { __val = __x; }
kono
parents:
diff changeset
483 };
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 #define _GLIBCXX_USE_DECIMAL_ 1
kono
parents:
diff changeset
486 } // namespace decimal
kono
parents:
diff changeset
487 // @} group decimal
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 _GLIBCXX_END_NAMESPACE_VERSION
kono
parents:
diff changeset
490 } // namespace std
kono
parents:
diff changeset
491
kono
parents:
diff changeset
492 #include <decimal/decimal.h>
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 #endif /* _GLIBCXX_DECIMAL */