1
/*      Copyright (C) 2006 Garrett A. Kajmowicz
 
 
2
        This file is part of the uClibc++ Library.
 
 
4
        This library is free software; you can redistribute it and/or
 
 
5
        modify it under the terms of the GNU Lesser General Public
 
 
6
        License as published by the Free Software Foundation; either
 
 
7
        version 2.1 of the License, or (at your option) any later version.
 
 
9
        This library is distributed in the hope that it will be useful,
 
 
10
        but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 
11
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
 
12
        Lesser General Public License for more details.
 
 
14
        You should have received a copy of the GNU Lesser General Public
 
 
15
        License along with this library; if not, write to the Free Software
 
 
16
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 
21
#ifndef __STD_HEADER_LIMITS
 
 
22
#define __STD_HEADER_LIMITS 1
 
 
25
//#warning limits header is nowhere complete or accurate
 
 
27
#pragma GCC visibility push(default)
 
 
31
enum float_round_style{
 
 
32
        round_indeterminate             =-1,
 
 
33
        round_toward_zero               = 0,
 
 
35
        round_toward_infinity           = 2,
 
 
36
        round_toward_neg_infinity       = 3
 
 
39
template <int bitsize> struct __bits_to_base_10{
 
 
40
        static const int size = -1;
 
 
42
template <> struct __bits_to_base_10<7>{
 
 
43
        static const int size = 2;
 
 
45
template <> struct __bits_to_base_10<8>{
 
 
46
        static const int size = 2;
 
 
48
template <> struct __bits_to_base_10<9>{
 
 
49
        static const int size = 2;
 
 
51
template <> struct __bits_to_base_10<10>{
 
 
52
        static const int size = 3;
 
 
54
template <> struct __bits_to_base_10<15>{
 
 
55
        static const int size = 4;
 
 
57
template <> struct __bits_to_base_10<16>{
 
 
58
        static const int size = 4;
 
 
60
template <> struct __bits_to_base_10<17>{
 
 
61
        static const int size = 5;
 
 
63
template <> struct __bits_to_base_10<18>{
 
 
64
        static const int size = 5;
 
 
66
template <> struct __bits_to_base_10<31>{
 
 
67
        static const int size = 9;
 
 
69
template <> struct __bits_to_base_10<32>{
 
 
70
        static const int size = 9;
 
 
72
template <> struct __bits_to_base_10<35>{
 
 
73
        static const int size = 10;
 
 
75
template <> struct __bits_to_base_10<36>{
 
 
76
        static const int size = 10;
 
 
78
template <> struct __bits_to_base_10<63>{
 
 
79
        static const int size = 18;
 
 
81
template <> struct __bits_to_base_10<64>{
 
 
82
        static const int size = 19;
 
 
84
template <> struct __bits_to_base_10<71>{
 
 
85
        static const int size = 21;
 
 
87
template <> struct __bits_to_base_10<72>{
 
 
88
        static const int size = 21;
 
 
90
template <> struct __bits_to_base_10<79>{
 
 
91
        static const int size = 23;
 
 
93
template <> struct __bits_to_base_10<80>{
 
 
94
        static const int size = 24;
 
 
96
template <> struct __bits_to_base_10<127>{
 
 
97
        static const int size = 38;
 
 
99
template <> struct __bits_to_base_10<128>{
 
 
100
        static const int size = 38;
 
 
108
template <class T> class numeric_limits {
 
 
110
        // General -- meaningful for all specializations.
 
 
112
        static const bool is_specialized = false;
 
 
115
        static const int radix;
 
 
116
        static const int digits;
 
 
117
        static const int digits10;
 
 
118
        static const bool is_signed;
 
 
119
        static const bool is_integer;
 
 
120
        static const bool is_exact;
 
 
121
        static const bool traps;
 
 
122
        static const bool is_modulo;
 
 
123
        static const bool is_bounded;
 
 
125
        // Floating point specific.
 
 
128
        static T round_error();
 
 
129
        static const int min_exponent10;
 
 
130
        static const int max_exponent10;
 
 
131
        static const int min_exponent;
 
 
133
        static const int max_exponent;
 
 
134
        static const bool has_infinity;
 
 
135
        static const bool has_quiet_NaN;
 
 
136
        static const bool has_signaling_NaN;
 
 
137
        static const bool is_iec559;
 
 
138
        static const bool has_denorm;
 
 
139
        static const bool tinyness_before;
 
 
140
        static const float_round_style round_style;
 
 
141
        static T denorm_min();
 
 
143
        static T quiet_NaN();
 
 
144
        static T signaling_NaN();
 
 
147
template <> class numeric_limits<bool> {
 
 
150
        // General -- meaningful for all specializations.
 
 
151
        static const bool is_specialized = true;
 
 
158
        static const int radix = 2;
 
 
159
        static const int digits = 1;
 
 
160
        static const int digits10 = 0;
 
 
161
        static const bool is_signed = false;
 
 
162
        static const bool is_integer = true;
 
 
163
        static const bool is_exact = true;
 
 
164
        static const bool traps = false;
 
 
165
        static const bool is_modulo = false;
 
 
166
        static const bool is_bounded = true;
 
 
168
        // Floating point specific.
 
 
173
        static T round_error(){
 
 
176
        static const int min_exponent10 = 0;
 
 
177
        static const int max_exponent10 = 0;
 
 
178
        static const int min_exponent = 0;
 
 
180
        static const int max_exponent = 0;
 
 
181
        static const bool has_infinity = false;
 
 
182
        static const bool has_quiet_NaN = false;
 
 
183
        static const bool has_signaling_NaN = false;
 
 
184
        static const bool is_iec559 = false;
 
 
185
        static const bool has_denorm = false;
 
 
186
        static const bool tinyness_before = false;
 
 
187
        static const float_round_style round_style = round_indeterminate;
 
 
188
        static T denorm_min();
 
 
190
        static T quiet_NaN();
 
 
191
        static T signaling_NaN();
 
 
194
template <> class numeric_limits<unsigned char> {
 
 
196
        typedef unsigned char T;
 
 
197
        // General -- meaningful for all specializations.
 
 
198
        static const bool is_specialized = true;
 
 
205
        static const int radix = 2;
 
 
206
        static const int digits = CHAR_BIT;
 
 
207
        static const int digits10 = __bits_to_base_10<digits>::size;
 
 
208
        static const bool is_signed = false;
 
 
209
        static const bool is_integer = true;
 
 
210
        static const bool is_exact = true;
 
 
211
        static const bool traps = false;
 
 
212
        static const bool is_modulo = true;
 
 
213
        static const bool is_bounded = true;
 
 
215
        // Floating point specific.
 
 
220
        static T round_error(){
 
 
223
        static const int min_exponent10 = 0;
 
 
224
        static const int max_exponent10 = 0;
 
 
225
        static const int min_exponent = 0;
 
 
227
        static const int max_exponent = 0;
 
 
228
        static const bool has_infinity = false;
 
 
229
        static const bool has_quiet_NaN = false;
 
 
230
        static const bool has_signaling_NaN = false;
 
 
231
        static const bool is_iec559 = false;
 
 
232
        static const bool has_denorm = false;
 
 
233
        static const bool tinyness_before = false;
 
 
234
        static const float_round_style round_style = round_indeterminate;
 
 
235
        static T denorm_min();
 
 
237
        static T quiet_NaN();
 
 
238
        static T signaling_NaN();
 
 
241
template <> class numeric_limits<signed char> {
 
 
243
        typedef signed char T;
 
 
244
        // General -- meaningful for all specializations.
 
 
245
        static const bool is_specialized = true;
 
 
252
        static const int radix = 2;
 
 
253
        static const int digits = CHAR_BIT - 1;
 
 
254
        static const int digits10 = __bits_to_base_10<digits>::size;
 
 
255
        static const bool is_signed = true;
 
 
256
        static const bool is_integer = true;
 
 
257
        static const bool is_exact = true;
 
 
258
        static const bool traps = false;
 
 
259
        static const bool is_modulo = true;
 
 
260
        static const bool is_bounded = true;
 
 
262
        // Floating point specific.
 
 
267
        static T round_error(){
 
 
270
        static const int min_exponent10 = 0;
 
 
271
        static const int max_exponent10 = 0;
 
 
272
        static const int min_exponent = 0;
 
 
274
        static const int max_exponent = 0;
 
 
275
        static const bool has_infinity = false;
 
 
276
        static const bool has_quiet_NaN = false;
 
 
277
        static const bool has_signaling_NaN = false;
 
 
278
        static const bool is_iec559 = false;
 
 
279
        static const bool has_denorm = false;
 
 
280
        static const bool tinyness_before = false;
 
 
281
        static const float_round_style round_style = round_indeterminate;
 
 
282
        static T denorm_min();
 
 
284
        static T quiet_NaN();
 
 
285
        static T signaling_NaN();
 
 
288
template <> class numeric_limits<char> {
 
 
291
        // General -- meaningful for all specializations.
 
 
292
        static const bool is_specialized = true;
 
 
299
        static const int radix = 2;
 
 
300
        static const int digits = (CHAR_MIN != 0) ? CHAR_BIT - 1 : CHAR_BIT;
 
 
301
        static const int digits10 = __bits_to_base_10<digits>::size;
 
 
302
        static const bool is_signed = (CHAR_MIN != 0);
 
 
303
        static const bool is_integer = true;
 
 
304
        static const bool is_exact = true;
 
 
305
        static const bool traps = false;
 
 
306
        static const bool is_modulo = true;
 
 
307
        static const bool is_bounded = true;
 
 
309
        // Floating point specific.
 
 
314
        static T round_error(){
 
 
317
        static const int min_exponent10 = 0;
 
 
318
        static const int max_exponent10 = 0;
 
 
319
        static const int min_exponent = 0;
 
 
321
        static const int max_exponent = 0;
 
 
322
        static const bool has_infinity = false;
 
 
323
        static const bool has_quiet_NaN = false;
 
 
324
        static const bool has_signaling_NaN = false;
 
 
325
        static const bool is_iec559 = false;
 
 
326
        static const bool has_denorm = false;
 
 
327
        static const bool tinyness_before = false;
 
 
328
        static const float_round_style round_style = round_indeterminate;
 
 
329
        static T denorm_min();
 
 
331
        static T quiet_NaN();
 
 
332
        static T signaling_NaN();
 
 
335
template <> class numeric_limits<unsigned short> {
 
 
337
        typedef unsigned short T;
 
 
338
        // General -- meaningful for all specializations.
 
 
339
        static const bool is_specialized = true;
 
 
346
        static const int radix = 2;
 
 
347
        static const int digits = CHAR_BIT * sizeof(T);
 
 
348
        static const int digits10 = __bits_to_base_10<digits>::size;
 
 
349
        static const bool is_signed = false;
 
 
350
        static const bool is_integer = true;
 
 
351
        static const bool is_exact = true;
 
 
352
        static const bool traps = false;
 
 
353
        static const bool is_modulo = true;
 
 
354
        static const bool is_bounded = true;
 
 
356
        // Floating point specific.
 
 
361
        static T round_error(){
 
 
364
        static const int min_exponent10 = 0;
 
 
365
        static const int max_exponent10 = 0;
 
 
366
        static const int min_exponent = 0;
 
 
368
        static const int max_exponent = 0;
 
 
369
        static const bool has_infinity = false;
 
 
370
        static const bool has_quiet_NaN = false;
 
 
371
        static const bool has_signaling_NaN = false;
 
 
372
        static const bool is_iec559 = false;
 
 
373
        static const bool has_denorm = false;
 
 
374
        static const bool tinyness_before = false;
 
 
375
        static const float_round_style round_style = round_indeterminate;
 
 
376
        static T denorm_min();
 
 
378
        static T quiet_NaN();
 
 
379
        static T signaling_NaN();
 
 
382
template <> class numeric_limits<signed short> {
 
 
384
        typedef signed short T;
 
 
385
        // General -- meaningful for all specializations.
 
 
386
        static const bool is_specialized = true;
 
 
393
        static const int radix = 2;
 
 
394
        static const int digits = CHAR_BIT * sizeof(T);
 
 
395
        static const int digits10 = __bits_to_base_10<digits>::size;
 
 
396
        static const bool is_signed = true;
 
 
397
        static const bool is_integer = true;
 
 
398
        static const bool is_exact = true;
 
 
399
        static const bool traps = false;
 
 
400
        static const bool is_modulo = true;
 
 
401
        static const bool is_bounded = true;
 
 
403
        // Floating point specific.
 
 
408
        static T round_error(){
 
 
411
        static const int min_exponent10 = 0;
 
 
412
        static const int max_exponent10 = 0;
 
 
413
        static const int min_exponent = 0;
 
 
415
        static const int max_exponent = 0;
 
 
416
        static const bool has_infinity = false;
 
 
417
        static const bool has_quiet_NaN = false;
 
 
418
        static const bool has_signaling_NaN = false;
 
 
419
        static const bool is_iec559 = false;
 
 
420
        static const bool has_denorm = false;
 
 
421
        static const bool tinyness_before = false;
 
 
422
        static const float_round_style round_style = round_indeterminate;
 
 
423
        static T denorm_min();
 
 
425
        static T quiet_NaN();
 
 
426
        static T signaling_NaN();
 
 
429
template <> class numeric_limits<unsigned int> {
 
 
431
        typedef unsigned int T;
 
 
432
        // General -- meaningful for all specializations.
 
 
433
        static const bool is_specialized = true;
 
 
440
        static const int radix = 2;
 
 
441
        static const int digits = CHAR_BIT * sizeof(T);
 
 
442
        static const int digits10 = __bits_to_base_10<digits>::size;
 
 
443
        static const bool is_signed = false;
 
 
444
        static const bool is_integer = true;
 
 
445
        static const bool is_exact = true;
 
 
446
        static const bool traps = false;
 
 
447
        static const bool is_modulo = true;
 
 
448
        static const bool is_bounded = true;
 
 
450
        // Floating point specific.
 
 
455
        static T round_error(){
 
 
458
        static const int min_exponent10 = 0;
 
 
459
        static const int max_exponent10 = 0;
 
 
460
        static const int min_exponent = 0;
 
 
462
        static const int max_exponent = 0;
 
 
463
        static const bool has_infinity = false;
 
 
464
        static const bool has_quiet_NaN = false;
 
 
465
        static const bool has_signaling_NaN = false;
 
 
466
        static const bool is_iec559 = false;
 
 
467
        static const bool has_denorm = false;
 
 
468
        static const bool tinyness_before = false;
 
 
469
        static const float_round_style round_style = round_indeterminate;
 
 
470
        static T denorm_min();
 
 
472
        static T quiet_NaN();
 
 
473
        static T signaling_NaN();
 
 
476
template <> class numeric_limits<signed int> {
 
 
478
        typedef signed int T;
 
 
479
        // General -- meaningful for all specializations.
 
 
480
        static const bool is_specialized = true;
 
 
487
        static const int radix = 2;
 
 
488
        static const int digits = CHAR_BIT * sizeof(T);
 
 
489
        static const int digits10 = __bits_to_base_10<digits>::size;
 
 
490
        static const bool is_signed = true;
 
 
491
        static const bool is_integer = true;
 
 
492
        static const bool is_exact = true;
 
 
493
        static const bool traps = false;
 
 
494
        static const bool is_modulo = true;
 
 
495
        static const bool is_bounded = true;
 
 
497
        // Floating point specific.
 
 
502
        static T round_error(){
 
 
505
        static const int min_exponent10 = 0;
 
 
506
        static const int max_exponent10 = 0;
 
 
507
        static const int min_exponent = 0;
 
 
509
        static const int max_exponent = 0;
 
 
510
        static const bool has_infinity = false;
 
 
511
        static const bool has_quiet_NaN = false;
 
 
512
        static const bool has_signaling_NaN = false;
 
 
513
        static const bool is_iec559 = false;
 
 
514
        static const bool has_denorm = false;
 
 
515
        static const bool tinyness_before = false;
 
 
516
        static const float_round_style round_style = round_indeterminate;
 
 
517
        static T denorm_min();
 
 
519
        static T quiet_NaN();
 
 
520
        static T signaling_NaN();
 
 
523
template <> class numeric_limits<unsigned long int> {
 
 
525
        typedef unsigned long int T;
 
 
526
        // General -- meaningful for all specializations.
 
 
527
        static const bool is_specialized = true;
 
 
534
        static const int radix = 2;
 
 
535
        static const int digits = CHAR_BIT * sizeof(T);
 
 
536
        static const int digits10 = __bits_to_base_10<digits>::size;
 
 
537
        static const bool is_signed = false;
 
 
538
        static const bool is_integer = true;
 
 
539
        static const bool is_exact = true;
 
 
540
        static const bool traps = false;
 
 
541
        static const bool is_modulo = true;
 
 
542
        static const bool is_bounded = true;
 
 
544
        // Floating point specific.
 
 
549
        static T round_error(){
 
 
552
        static const int min_exponent10 = 0;
 
 
553
        static const int max_exponent10 = 0;
 
 
554
        static const int min_exponent = 0;
 
 
556
        static const int max_exponent = 0;
 
 
557
        static const bool has_infinity = false;
 
 
558
        static const bool has_quiet_NaN = false;
 
 
559
        static const bool has_signaling_NaN = false;
 
 
560
        static const bool is_iec559 = false;
 
 
561
        static const bool has_denorm = false;
 
 
562
        static const bool tinyness_before = false;
 
 
563
        static const float_round_style round_style = round_indeterminate;
 
 
564
        static T denorm_min();
 
 
566
        static T quiet_NaN();
 
 
567
        static T signaling_NaN();
 
 
570
template <> class numeric_limits<signed long int> {
 
 
572
        typedef signed long int T;
 
 
573
        // General -- meaningful for all specializations.
 
 
574
        static const bool is_specialized = true;
 
 
581
        static const int radix = 2;
 
 
582
        static const int digits = CHAR_BIT * sizeof(T);
 
 
583
        static const int digits10 = __bits_to_base_10<digits>::size;
 
 
584
        static const bool is_signed = true;
 
 
585
        static const bool is_integer = true;
 
 
586
        static const bool is_exact = true;
 
 
587
        static const bool traps = false;
 
 
588
        static const bool is_modulo = true;
 
 
589
        static const bool is_bounded = true;
 
 
591
        // Floating point specific.
 
 
596
        static T round_error(){
 
 
599
        static const int min_exponent10 = 0;
 
 
600
        static const int max_exponent10 = 0;
 
 
601
        static const int min_exponent = 0;
 
 
603
        static const int max_exponent = 0;
 
 
604
        static const bool has_infinity = false;
 
 
605
        static const bool has_quiet_NaN = false;
 
 
606
        static const bool has_signaling_NaN = false;
 
 
607
        static const bool is_iec559 = false;
 
 
608
        static const bool has_denorm = false;
 
 
609
        static const bool tinyness_before = false;
 
 
610
        static const float_round_style round_style = round_indeterminate;
 
 
611
        static T denorm_min();
 
 
613
        static T quiet_NaN();
 
 
614
        static T signaling_NaN();
 
 
617
template <> class numeric_limits<double> {
 
 
619
        typedef double numeric_type;
 
 
621
        static const bool is_specialized = true;
 
 
622
        static numeric_type min () { return __DBL_MIN__; }
 
 
623
        static numeric_type max () { return __DBL_MAX__; }
 
 
624
        static const int radix = __FLT_RADIX__;
 
 
625
        static const int digits = __DBL_MANT_DIG__;
 
 
626
        static const int digits10 = __DBL_DIG__;
 
 
627
        static const bool is_signed = true;
 
 
628
        static const bool is_integer = false;
 
 
629
        static const bool is_exact = false;
 
 
630
        static const bool traps = false; // this is a guess
 
 
631
        static const bool is_modulo = false;
 
 
632
        static const bool is_bounded = true;
 
 
634
        // Floating point specific.
 
 
636
        static numeric_type epsilon () { return __DBL_EPSILON__; }
 
 
637
        static numeric_type round_error () { return 0.5; }
 
 
638
        static const int min_exponent10 = -1; //How do I properly get this?
 
 
639
        static const int max_exponent10 = -1; //How do I properly get this?
 
 
640
        static const int min_exponent   = -1; //How do I properly get this?
 
 
641
        static const int max_exponent   = -1; //How do I properly get this?
 
 
642
        static const bool has_infinity  = false; //I don't know, so until I can find out, I'm saying no
 
 
643
        static const bool has_quiet_NaN = false; //I don't know, so until I can find out, I'm saying no
 
 
644
        static const bool has_signaling_NaN = false; //I don't know, so until I can find out, I'm saying no
 
 
645
        static const bool has_denorm = false; //I don't know, so until I can find out, I'm saying no
 
 
647
        static const bool is_iec559 = false;  //I don't know, so until I can find out, I'm saying no
 
 
648
        static const bool tinyness_before = false; // more questions
 
 
649
        static const float_round_style round_style = round_to_nearest; // more questions
 
 
650
        static numeric_type denorm_min () { return -1; } //How do I properly get this?
 
 
651
        static numeric_type infinity () { return -1; } //How do I properly get this?
 
 
652
        static numeric_type quiet_NaN () { return -1; } //How do I properly get this?
 
 
653
        static numeric_type signaling_NaN () { return -1; } //How do I properly get this?
 
 
662
#pragma GCC visibility pop