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