1 /* ------------------------------------------------------------------ */ 2 /* decQuad.h -- Decimal 128-bit format module header */ 3 /* ------------------------------------------------------------------ */ 4 /* Copyright (c) IBM Corporation, 2000, 2010. All rights reserved. */ 5 /* */ 6 /* This software is made available under the terms of the */ 7 /* ICU License -- ICU 1.8.1 and later. */ 8 /* */ 9 /* The description and User's Guide ("The decNumber C Library") for */ 10 /* this software is included in the package as decNumber.pdf. This */ 11 /* document is also available in HTML, together with specifications, */ 12 /* testcases, and Web links, on the General Decimal Arithmetic page. */ 13 /* */ 14 /* Please send comments, suggestions, and corrections to the author: */ 15 /* mfc@uk.ibm.com */ 16 /* Mike Cowlishaw, IBM Fellow */ 17 /* IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK */ 18 /* ------------------------------------------------------------------ */ 19 /* This include file is always included by decSingle and decDouble, */ 20 /* and therefore also holds useful constants used by all three. */ 21 22 #if !defined(DECQUAD) 23 # define DECQUAD 24 25 # define DECQUADNAME "decimalQuad" /* Short name */ 26 # define DECQUADTITLE "Decimal 128-bit datum" /* Verbose name */ 27 # define DECQUADAUTHOR "Mike Cowlishaw" /* Who to blame */ 28 29 /* parameters for decQuads */ 30 # define DECQUAD_Bytes 16 /* length */ 31 # define DECQUAD_Pmax 34 /* maximum precision (digits) */ 32 # define DECQUAD_Emin -6143 /* minimum adjusted exponent */ 33 # define DECQUAD_Emax 6144 /* maximum adjusted exponent */ 34 # define DECQUAD_EmaxD 4 /* maximum exponent digits */ 35 # define DECQUAD_Bias 6176 /* bias for the exponent */ 36 # define DECQUAD_String 43 /* maximum string length, +1 */ 37 # define DECQUAD_EconL 12 /* exponent continuation length */ 38 # define DECQUAD_Declets 11 /* count of declets */ 39 /* highest biased exponent (Elimit-1) */ 40 # define DECQUAD_Ehigh (DECQUAD_Emax + DECQUAD_Bias - (DECQUAD_Pmax-1)) 41 42 /* Required include */ 43 # include "decContext.h" 44 45 /* The decQuad decimal 128-bit type, accessible by all sizes */ 46 typedef union { 47 uint8_t bytes[DECQUAD_Bytes]; /* fields: 1, 5, 12, 110 bits */ 48 uint16_t shorts[DECQUAD_Bytes/2]; 49 uint32_t words[DECQUAD_Bytes/4]; 50 # if DECUSE64 51 uint64_t longs[DECQUAD_Bytes/8]; 52 # endif 53 } decQuad; 54 55 /* ---------------------------------------------------------------- */ 56 /* Shared constants */ 57 /* ---------------------------------------------------------------- */ 58 59 /* sign and special values [top 32-bits; last two bits are don't-care 60 for Infinity on input, last bit don't-care for NaNs] */ 61 # define DECFLOAT_Sign 0x80000000 /* 1 00000 00 Sign */ 62 # define DECFLOAT_NaN 0x7c000000 /* 0 11111 00 NaN generic */ 63 # define DECFLOAT_qNaN 0x7c000000 /* 0 11111 00 qNaN */ 64 # define DECFLOAT_sNaN 0x7e000000 /* 0 11111 10 sNaN */ 65 # define DECFLOAT_Inf 0x78000000 /* 0 11110 00 Infinity */ 66 # define DECFLOAT_MinSp 0x78000000 /* minimum special value */ 67 /* [specials are all >=MinSp] */ 68 /* Sign nibble constants */ 69 # if !defined(DECPPLUSALT) 70 # define DECPPLUSALT 0x0A /* alternate plus nibble */ 71 # define DECPMINUSALT 0x0B /* alternate minus nibble */ 72 # define DECPPLUS 0x0C /* preferred plus nibble */ 73 # define DECPMINUS 0x0D /* preferred minus nibble */ 74 # define DECPPLUSALT2 0x0E /* alternate plus nibble */ 75 # define DECPUNSIGNED 0x0F /* alternate plus nibble (unsigned) */ 76 # endif 77 78 /* ---------------------------------------------------------------- */ 79 /* Routines -- implemented as decFloat routines in common files */ 80 /* ---------------------------------------------------------------- */ 81 82 /* Utilities and conversions, extractors, etc.) */ 83 extern decQuad * decQuadFromBCD(decQuad *, int32_t, const uint8_t *, int32_t); 84 extern decQuad * decQuadFromInt32(decQuad *, int32_t); 85 extern decQuad * decQuadFromPacked(decQuad *, int32_t, const uint8_t *); 86 extern decQuad * decQuadFromPackedChecked(decQuad *, int32_t, const uint8_t *); 87 extern decQuad * decQuadFromString(decQuad *, const char *, decContext *); 88 extern decQuad * decQuadFromUInt32(decQuad *, uint32_t); 89 extern int32_t decQuadGetCoefficient(const decQuad *, uint8_t *); 90 extern int32_t decQuadGetExponent(const decQuad *); 91 extern decQuad * decQuadSetCoefficient(decQuad *, const uint8_t *, int32_t); 92 extern decQuad * decQuadSetExponent(decQuad *, decContext *, int32_t); 93 extern void decQuadShow(const decQuad *, const char *); 94 extern int32_t decQuadToBCD(const decQuad *, int32_t *, uint8_t *); 95 extern char * decQuadToEngString(const decQuad *, char *); 96 extern int32_t decQuadToInt32(const decQuad *, decContext *, enum rounding); 97 extern int32_t decQuadToInt32Exact(const decQuad *, decContext *, enum rounding); 98 extern int32_t decQuadToPacked(const decQuad *, int32_t *, uint8_t *); 99 extern char * decQuadToString(const decQuad *, char *); 100 extern uint32_t decQuadToUInt32(const decQuad *, decContext *, enum rounding); 101 extern uint32_t decQuadToUInt32Exact(const decQuad *, decContext *, enum rounding); 102 extern decQuad * decQuadZero(decQuad *); 103 104 /* Computational (result is a decQuad) */ 105 extern decQuad * decQuadAbs(decQuad *, const decQuad *, decContext *); 106 extern decQuad * decQuadAdd(decQuad *, const decQuad *, const decQuad *, decContext *); 107 extern decQuad * decQuadAnd(decQuad *, const decQuad *, const decQuad *, decContext *); 108 extern decQuad * decQuadDivide(decQuad *, const decQuad *, const decQuad *, decContext *); 109 extern decQuad * decQuadDivideInteger(decQuad *, const decQuad *, const decQuad *, decContext *); 110 extern decQuad * decQuadFMA(decQuad *, const decQuad *, const decQuad *, const decQuad *, decContext *); 111 extern decQuad * decQuadInvert(decQuad *, const decQuad *, decContext *); 112 extern decQuad * decQuadLogB(decQuad *, const decQuad *, decContext *); 113 extern decQuad * decQuadMax(decQuad *, const decQuad *, const decQuad *, decContext *); 114 extern decQuad * decQuadMaxMag(decQuad *, const decQuad *, const decQuad *, decContext *); 115 extern decQuad * decQuadMin(decQuad *, const decQuad *, const decQuad *, decContext *); 116 extern decQuad * decQuadMinMag(decQuad *, const decQuad *, const decQuad *, decContext *); 117 extern decQuad * decQuadMinus(decQuad *, const decQuad *, decContext *); 118 extern decQuad * decQuadMultiply(decQuad *, const decQuad *, const decQuad *, decContext *); 119 extern decQuad * decQuadNextMinus(decQuad *, const decQuad *, decContext *); 120 extern decQuad * decQuadNextPlus(decQuad *, const decQuad *, decContext *); 121 extern decQuad * decQuadNextToward(decQuad *, const decQuad *, const decQuad *, decContext *); 122 extern decQuad * decQuadOr(decQuad *, const decQuad *, const decQuad *, decContext *); 123 extern decQuad * decQuadPlus(decQuad *, const decQuad *, decContext *); 124 extern decQuad * decQuadQuantize(decQuad *, const decQuad *, const decQuad *, decContext *); 125 extern decQuad * decQuadReduce(decQuad *, const decQuad *, decContext *); 126 extern decQuad * decQuadRemainder(decQuad *, const decQuad *, const decQuad *, decContext *); 127 extern decQuad * decQuadRemainderNear(decQuad *, const decQuad *, const decQuad *, decContext *); 128 extern decQuad * decQuadRotate(decQuad *, const decQuad *, const decQuad *, decContext *); 129 extern decQuad * decQuadScaleB(decQuad *, const decQuad *, const decQuad *, decContext *); 130 extern decQuad * decQuadShift(decQuad *, const decQuad *, const decQuad *, decContext *); 131 extern decQuad * decQuadSubtract(decQuad *, const decQuad *, const decQuad *, decContext *); 132 extern decQuad * decQuadToIntegralValue(decQuad *, const decQuad *, decContext *, enum rounding); 133 extern decQuad * decQuadToIntegralExact(decQuad *, const decQuad *, decContext *); 134 extern decQuad * decQuadXor(decQuad *, const decQuad *, const decQuad *, decContext *); 135 136 /* Comparisons */ 137 extern decQuad * decQuadCompare(decQuad *, const decQuad *, const decQuad *, decContext *); 138 extern decQuad * decQuadCompareSignal(decQuad *, const decQuad *, const decQuad *, decContext *); 139 extern decQuad * decQuadCompareTotal(decQuad *, const decQuad *, const decQuad *); 140 extern decQuad * decQuadCompareTotalMag(decQuad *, const decQuad *, const decQuad *); 141 142 /* Copies */ 143 extern decQuad * decQuadCanonical(decQuad *, const decQuad *); 144 extern decQuad * decQuadCopy(decQuad *, const decQuad *); 145 extern decQuad * decQuadCopyAbs(decQuad *, const decQuad *); 146 extern decQuad * decQuadCopyNegate(decQuad *, const decQuad *); 147 extern decQuad * decQuadCopySign(decQuad *, const decQuad *, const decQuad *); 148 149 /* Non-computational */ 150 extern enum decClass decQuadClass(const decQuad *); 151 extern const char * decQuadClassString(const decQuad *); 152 extern uint32_t decQuadDigits(const decQuad *); 153 extern uint32_t decQuadIsCanonical(const decQuad *); 154 extern uint32_t decQuadIsFinite(const decQuad *); 155 extern uint32_t decQuadIsInteger(const decQuad *); 156 extern uint32_t decQuadIsLogical(const decQuad *); 157 extern uint32_t decQuadIsInfinite(const decQuad *); 158 extern uint32_t decQuadIsNaN(const decQuad *); 159 extern uint32_t decQuadIsNegative(const decQuad *); 160 extern uint32_t decQuadIsNormal(const decQuad *); 161 extern uint32_t decQuadIsPositive(const decQuad *); 162 extern uint32_t decQuadIsSignaling(const decQuad *); 163 extern uint32_t decQuadIsSignalling(const decQuad *); 164 extern uint32_t decQuadIsSigned(const decQuad *); 165 extern uint32_t decQuadIsSubnormal(const decQuad *); 166 extern uint32_t decQuadIsZero(const decQuad *); 167 extern uint32_t decQuadRadix(const decQuad *); 168 extern uint32_t decQuadSameQuantum(const decQuad *, const decQuad *); 169 extern const char * decQuadVersion(void); 170 171 /* decNumber conversions; these are implemented as macros so as not */ 172 /* to force a dependency on decimal128 and decNumber in decQuad. */ 173 /* decQuadFromNumber returns a decimal128 * to avoid warnings. */ 174 # define decQuadToNumber(dq, dn) \ 175 decimal128ToNumber((decimal128 *)(dq), dn) 176 # define decQuadFromNumber(dq, dn, set) \ 177 decimal128FromNumber((decimal128 *)(dq), dn, set) 178 179 #endif 180