Tom Musta | 72ac97c | 2014-04-21 15:54:45 -0500 | [diff] [blame] | 1 | /* Decimal number arithmetic module header for the decNumber C Library. |
| 2 | Copyright (C) 2005, 2007 Free Software Foundation, Inc. |
| 3 | Contributed by IBM Corporation. Author Mike Cowlishaw. |
| 4 | |
| 5 | This file is part of GCC. |
| 6 | |
| 7 | GCC is free software; you can redistribute it and/or modify it under |
| 8 | the terms of the GNU General Public License as published by the Free |
| 9 | Software Foundation; either version 2, or (at your option) any later |
| 10 | version. |
| 11 | |
| 12 | In addition to the permissions in the GNU General Public License, |
| 13 | the Free Software Foundation gives you unlimited permission to link |
| 14 | the compiled version of this file into combinations with other |
| 15 | programs, and to distribute those combinations without any |
| 16 | restriction coming from the use of this file. (The General Public |
| 17 | License restrictions do apply in other respects; for example, they |
| 18 | cover modification of the file, and distribution when not linked |
| 19 | into a combine executable.) |
| 20 | |
| 21 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
| 22 | WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 23 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 24 | for more details. |
| 25 | |
| 26 | You should have received a copy of the GNU General Public License |
| 27 | along with GCC; see the file COPYING. If not, write to the Free |
| 28 | Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA |
| 29 | 02110-1301, USA. */ |
| 30 | |
| 31 | /* ------------------------------------------------------------------ */ |
| 32 | /* Decimal Number arithmetic module header */ |
| 33 | /* ------------------------------------------------------------------ */ |
| 34 | |
Markus Armbruster | 2a6a407 | 2016-06-29 13:47:03 +0200 | [diff] [blame] | 35 | #ifndef DECNUMBER_H |
| 36 | #define DECNUMBER_H |
| 37 | |
Tom Musta | 72ac97c | 2014-04-21 15:54:45 -0500 | [diff] [blame] | 38 | #define DECNAME "decNumber" /* Short name */ |
| 39 | #define DECFULLNAME "Decimal Number Module" /* Verbose name */ |
| 40 | #define DECAUTHOR "Mike Cowlishaw" /* Who to blame */ |
| 41 | |
Markus Armbruster | 6031a51 | 2016-06-29 11:45:54 +0200 | [diff] [blame] | 42 | #include "libdecnumber/decContext.h" |
Tom Musta | 72ac97c | 2014-04-21 15:54:45 -0500 | [diff] [blame] | 43 | |
| 44 | /* Bit settings for decNumber.bits */ |
| 45 | #define DECNEG 0x80 /* Sign; 1=negative, 0=positive or zero */ |
| 46 | #define DECINF 0x40 /* 1=Infinity */ |
| 47 | #define DECNAN 0x20 /* 1=NaN */ |
| 48 | #define DECSNAN 0x10 /* 1=sNaN */ |
| 49 | /* The remaining bits are reserved; they must be 0 */ |
| 50 | #define DECSPECIAL (DECINF|DECNAN|DECSNAN) /* any special value */ |
| 51 | |
| 52 | /* Define the decNumber data structure. The size and shape of the */ |
| 53 | /* units array in the structure is determined by the following */ |
| 54 | /* constant. This must not be changed without recompiling the */ |
| 55 | /* decNumber library modules. */ |
| 56 | |
| 57 | #define DECDPUN 3 /* DECimal Digits Per UNit [must be >0 */ |
| 58 | /* and <10; 3 or powers of 2 are best]. */ |
| 59 | |
| 60 | /* DECNUMDIGITS is the default number of digits that can be held in */ |
| 61 | /* the structure. If undefined, 1 is assumed and it is assumed */ |
| 62 | /* that the structure will be immediately followed by extra space, */ |
| 63 | /* as required. DECNUMDIGITS is always >0. */ |
| 64 | #if !defined(DECNUMDIGITS) |
| 65 | #define DECNUMDIGITS 1 |
| 66 | #endif |
| 67 | |
| 68 | /* The size (integer data type) of each unit is determined by the */ |
| 69 | /* number of digits it will hold. */ |
| 70 | #if DECDPUN<=2 |
| 71 | #define decNumberUnit uint8_t |
| 72 | #elif DECDPUN<=4 |
| 73 | #define decNumberUnit uint16_t |
| 74 | #else |
| 75 | #define decNumberUnit uint32_t |
| 76 | #endif |
| 77 | /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN) */ |
| 78 | #define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN) |
| 79 | |
| 80 | /* The data structure... */ |
| 81 | typedef struct { |
| 82 | int32_t digits; /* Count of digits in the coefficient; >0 */ |
| 83 | int32_t exponent; /* Unadjusted exponent, unbiased, in */ |
| 84 | /* range: -1999999997 through 999999999 */ |
| 85 | uint8_t bits; /* Indicator bits (see above) */ |
| 86 | /* Coefficient, from least significant unit */ |
| 87 | decNumberUnit lsu[DECNUMUNITS]; |
| 88 | } decNumber; |
| 89 | |
| 90 | /* Notes: */ |
| 91 | /* 1. If digits is > DECDPUN then there will one or more */ |
| 92 | /* decNumberUnits immediately following the first element of lsu.*/ |
| 93 | /* These contain the remaining (more significant) digits of the */ |
| 94 | /* number, and may be in the lsu array, or may be guaranteed by */ |
| 95 | /* some other mechanism (such as being contained in another */ |
| 96 | /* structure, or being overlaid on dynamically allocated */ |
| 97 | /* storage). */ |
| 98 | /* */ |
| 99 | /* Each integer of the coefficient (except potentially the last) */ |
| 100 | /* contains DECDPUN digits (e.g., a value in the range 0 through */ |
| 101 | /* 99999999 if DECDPUN is 8, or 0 through 999 if DECDPUN is 3). */ |
| 102 | /* */ |
| 103 | /* 2. A decNumber converted to a string may need up to digits+14 */ |
| 104 | /* characters. The worst cases (non-exponential and exponential */ |
| 105 | /* formats) are -0.00000{9...}# and -9.{9...}E+999999999# */ |
| 106 | /* (where # is '\0') */ |
| 107 | |
| 108 | |
| 109 | /* ---------------------------------------------------------------- */ |
| 110 | /* decNumber public functions and macros */ |
| 111 | /* ---------------------------------------------------------------- */ |
| 112 | |
Tom Musta | 72ac97c | 2014-04-21 15:54:45 -0500 | [diff] [blame] | 113 | |
| 114 | /* Conversions */ |
| 115 | decNumber * decNumberFromInt32(decNumber *, int32_t); |
| 116 | decNumber * decNumberFromUInt32(decNumber *, uint32_t); |
Tom Musta | 8e706db | 2014-04-21 15:54:53 -0500 | [diff] [blame] | 117 | decNumber *decNumberFromInt64(decNumber *, int64_t); |
| 118 | decNumber *decNumberFromUInt64(decNumber *, uint64_t); |
Tom Musta | 72ac97c | 2014-04-21 15:54:45 -0500 | [diff] [blame] | 119 | decNumber * decNumberFromString(decNumber *, const char *, decContext *); |
| 120 | char * decNumberToString(const decNumber *, char *); |
| 121 | char * decNumberToEngString(const decNumber *, char *); |
| 122 | uint32_t decNumberToUInt32(const decNumber *, decContext *); |
| 123 | int32_t decNumberToInt32(const decNumber *, decContext *); |
Tom Musta | 79af357 | 2014-04-21 15:54:54 -0500 | [diff] [blame] | 124 | int64_t decNumberIntegralToInt64(const decNumber *dn, decContext *set); |
Tom Musta | 72ac97c | 2014-04-21 15:54:45 -0500 | [diff] [blame] | 125 | uint8_t * decNumberGetBCD(const decNumber *, uint8_t *); |
| 126 | decNumber * decNumberSetBCD(decNumber *, const uint8_t *, uint32_t); |
| 127 | |
| 128 | /* Operators and elementary functions */ |
| 129 | decNumber * decNumberAbs(decNumber *, const decNumber *, decContext *); |
| 130 | decNumber * decNumberAdd(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 131 | decNumber * decNumberAnd(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 132 | decNumber * decNumberCompare(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 133 | decNumber * decNumberCompareSignal(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 134 | decNumber * decNumberCompareTotal(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 135 | decNumber * decNumberCompareTotalMag(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 136 | decNumber * decNumberDivide(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 137 | decNumber * decNumberDivideInteger(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 138 | decNumber * decNumberExp(decNumber *, const decNumber *, decContext *); |
| 139 | decNumber * decNumberFMA(decNumber *, const decNumber *, const decNumber *, const decNumber *, decContext *); |
| 140 | decNumber * decNumberInvert(decNumber *, const decNumber *, decContext *); |
| 141 | decNumber * decNumberLn(decNumber *, const decNumber *, decContext *); |
| 142 | decNumber * decNumberLogB(decNumber *, const decNumber *, decContext *); |
| 143 | decNumber * decNumberLog10(decNumber *, const decNumber *, decContext *); |
| 144 | decNumber * decNumberMax(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 145 | decNumber * decNumberMaxMag(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 146 | decNumber * decNumberMin(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 147 | decNumber * decNumberMinMag(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 148 | decNumber * decNumberMinus(decNumber *, const decNumber *, decContext *); |
| 149 | decNumber * decNumberMultiply(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 150 | decNumber * decNumberNormalize(decNumber *, const decNumber *, decContext *); |
| 151 | decNumber * decNumberOr(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 152 | decNumber * decNumberPlus(decNumber *, const decNumber *, decContext *); |
| 153 | decNumber * decNumberPower(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 154 | decNumber * decNumberQuantize(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 155 | decNumber * decNumberReduce(decNumber *, const decNumber *, decContext *); |
| 156 | decNumber * decNumberRemainder(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 157 | decNumber * decNumberRemainderNear(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 158 | decNumber * decNumberRescale(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 159 | decNumber * decNumberRotate(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 160 | decNumber * decNumberSameQuantum(decNumber *, const decNumber *, const decNumber *); |
| 161 | decNumber * decNumberScaleB(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 162 | decNumber * decNumberShift(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 163 | decNumber * decNumberSquareRoot(decNumber *, const decNumber *, decContext *); |
| 164 | decNumber * decNumberSubtract(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 165 | decNumber * decNumberToIntegralExact(decNumber *, const decNumber *, decContext *); |
| 166 | decNumber * decNumberToIntegralValue(decNumber *, const decNumber *, decContext *); |
| 167 | decNumber * decNumberXor(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 168 | |
| 169 | /* Utilities */ |
| 170 | enum decClass decNumberClass(const decNumber *, decContext *); |
| 171 | const char * decNumberClassToString(enum decClass); |
| 172 | decNumber * decNumberCopy(decNumber *, const decNumber *); |
| 173 | decNumber * decNumberCopyAbs(decNumber *, const decNumber *); |
| 174 | decNumber * decNumberCopyNegate(decNumber *, const decNumber *); |
| 175 | decNumber * decNumberCopySign(decNumber *, const decNumber *, const decNumber *); |
| 176 | decNumber * decNumberNextMinus(decNumber *, const decNumber *, decContext *); |
| 177 | decNumber * decNumberNextPlus(decNumber *, const decNumber *, decContext *); |
| 178 | decNumber * decNumberNextToward(decNumber *, const decNumber *, const decNumber *, decContext *); |
| 179 | decNumber * decNumberTrim(decNumber *); |
| 180 | const char * decNumberVersion(void); |
| 181 | decNumber * decNumberZero(decNumber *); |
| 182 | |
| 183 | /* Functions for testing decNumbers (normality depends on context) */ |
| 184 | int32_t decNumberIsNormal(const decNumber *, decContext *); |
| 185 | int32_t decNumberIsSubnormal(const decNumber *, decContext *); |
| 186 | |
| 187 | /* Macros for testing decNumber *dn */ |
| 188 | #define decNumberIsCanonical(dn) (1) /* All decNumbers are saintly */ |
| 189 | #define decNumberIsFinite(dn) (((dn)->bits&DECSPECIAL)==0) |
| 190 | #define decNumberIsInfinite(dn) (((dn)->bits&DECINF)!=0) |
| 191 | #define decNumberIsNaN(dn) (((dn)->bits&(DECNAN|DECSNAN))!=0) |
| 192 | #define decNumberIsNegative(dn) (((dn)->bits&DECNEG)!=0) |
| 193 | #define decNumberIsQNaN(dn) (((dn)->bits&(DECNAN))!=0) |
| 194 | #define decNumberIsSNaN(dn) (((dn)->bits&(DECSNAN))!=0) |
| 195 | #define decNumberIsSpecial(dn) (((dn)->bits&DECSPECIAL)!=0) |
| 196 | #define decNumberIsZero(dn) (*(dn)->lsu==0 \ |
| 197 | && (dn)->digits==1 \ |
| 198 | && (((dn)->bits&DECSPECIAL)==0)) |
| 199 | #define decNumberRadix(dn) (10) |
| 200 | |
| 201 | #endif |