#include <string.h>
#include <stdio.h>
#include "decContext.h"
#include "decNumberLocal.h"
Aller au code source de ce fichier.
#define LITEND *mfctop |
decContext* decContextClearStatus | ( | decContext * | context, | |
uInt | mask | |||
) |
Définition à la ligne 59 du fichier decContext.c.
Références decContext::status.
00059 { 00060 context->status&=~mask; 00061 return context; 00062 } // decContextClearStatus
decContext* decContextDefault | ( | decContext * | context, | |
Int | kind | |||
) |
Définition à la ligne 77 du fichier decContext.c.
Références decContext::clamp, DEC_Errors, DEC_INIT_BASE, DEC_INIT_DECIMAL128, DEC_INIT_DECIMAL32, DEC_INIT_DECIMAL64, DEC_Invalid_operation, DEC_MAX_EMAX, DEC_MIN_EMIN, DEC_ROUND_HALF_EVEN, DEC_ROUND_HALF_UP, decContextSetStatus(), decContext::digits, decContext::emax, decContext::emin, decContext::round, decContext::status, et decContext::traps.
Référencé par decExpOp(), DecFloatContext::DecFloatContext(), decLnOp(), decNumberLog10(), decNumberPower(), decNumberSquareRoot(), et decNumberTrim().
00077 { 00078 // set defaults... 00079 context->digits=9; // 9 digits 00080 context->emax=DEC_MAX_EMAX; // 9-digit exponents 00081 context->emin=DEC_MIN_EMIN; // .. balanced 00082 context->round=DEC_ROUND_HALF_UP; // 0.5 rises 00083 context->traps=DEC_Errors; // all but informational 00084 context->status=0; // cleared 00085 context->clamp=0; // no clamping 00086 #if DECSUBSET 00087 context->extended=0; // cleared 00088 #endif 00089 switch (kind) { 00090 case DEC_INIT_BASE: 00091 // [use defaults] 00092 break; 00093 case DEC_INIT_DECIMAL32: 00094 context->digits=7; // digits 00095 context->emax=96; // Emax 00096 context->emin=-95; // Emin 00097 context->round=DEC_ROUND_HALF_EVEN; // 0.5 to nearest even 00098 context->traps=0; // no traps set 00099 context->clamp=1; // clamp exponents 00100 #if DECSUBSET 00101 context->extended=1; // set 00102 #endif 00103 break; 00104 case DEC_INIT_DECIMAL64: 00105 context->digits=16; // digits 00106 context->emax=384; // Emax 00107 context->emin=-383; // Emin 00108 context->round=DEC_ROUND_HALF_EVEN; // 0.5 to nearest even 00109 context->traps=0; // no traps set 00110 context->clamp=1; // clamp exponents 00111 #if DECSUBSET 00112 context->extended=1; // set 00113 #endif 00114 break; 00115 case DEC_INIT_DECIMAL128: 00116 context->digits=34; // digits 00117 context->emax=6144; // Emax 00118 context->emin=-6143; // Emin 00119 context->round=DEC_ROUND_HALF_EVEN; // 0.5 to nearest even 00120 context->traps=0; // no traps set 00121 context->clamp=1; // clamp exponents 00122 #if DECSUBSET 00123 context->extended=1; // set 00124 #endif 00125 break; 00126 00127 default: // invalid Kind 00128 // use defaults, and .. 00129 decContextSetStatus(context, DEC_Invalid_operation); // trap 00130 } 00131 00132 return context;} // decContextDefault
enum rounding decContextGetRounding | ( | decContext * | context | ) |
Définition à la ligne 142 du fichier decContext.c.
Références decContext::round.
00142 { 00143 return context->round; 00144 } // decContextGetRounding
uInt decContextGetStatus | ( | decContext * | context | ) |
Définition à la ligne 154 du fichier decContext.c.
Références decContext::status.
00154 { 00155 return context->status; 00156 } // decContextGetStatus
decContext* decContextRestoreStatus | ( | decContext * | context, | |
uInt | newstatus, | |||
uInt | mask | |||
) |
Définition à la ligne 170 du fichier decContext.c.
Références decContext::status.
00171 { 00172 context->status&=~mask; // clear the selected bits 00173 context->status|=(mask&newstatus); // or in the new bits 00174 return context; 00175 } // decContextRestoreStatus
uInt decContextSaveStatus | ( | decContext * | context, | |
uInt | mask | |||
) |
Définition à la ligne 187 du fichier decContext.c.
Références decContext::status.
00187 { 00188 return context->status&mask; 00189 } // decContextSaveStatus
decContext* decContextSetRounding | ( | decContext * | context, | |
enum rounding | newround | |||
) |
Définition à la ligne 200 du fichier decContext.c.
Références decContext::round.
00201 { 00202 context->round=newround; 00203 return context; 00204 } // decContextSetRounding
decContext* decContextSetStatus | ( | decContext * | context, | |
uInt | status | |||
) |
Définition à la ligne 216 du fichier decContext.c.
Références decContext::status, et decContext::traps.
Référencé par decContextDefault(), decContextSetStatusFromString(), decNumberToInt32(), decNumberToUInt32(), et decStatus().
00216 { 00217 context->status|=status; 00218 if (status & context->traps) raise(SIGFPE); 00219 return context;} // decContextSetStatus
decContext* decContextSetStatusFromString | ( | decContext * | context, | |
const char * | string | |||
) |
Définition à la ligne 235 du fichier decContext.c.
Références DEC_Clamped, DEC_Condition_CS, DEC_Condition_DI, DEC_Condition_DU, DEC_Condition_DZ, DEC_Condition_IC, DEC_Condition_IE, DEC_Condition_IO, DEC_Condition_IS, DEC_Condition_OV, DEC_Condition_PA, DEC_Condition_RO, DEC_Condition_SU, DEC_Condition_UN, DEC_Condition_ZE, DEC_Conversion_syntax, DEC_Division_by_zero, DEC_Division_impossible, DEC_Division_undefined, DEC_Inexact, DEC_Insufficient_storage, DEC_Invalid_context, DEC_Invalid_operation, DEC_Overflow, DEC_Rounded, DEC_Subnormal, DEC_Underflow, et decContextSetStatus().
00236 { 00237 if (strcmp(string, DEC_Condition_CS)==0) 00238 return decContextSetStatus(context, DEC_Conversion_syntax); 00239 if (strcmp(string, DEC_Condition_DZ)==0) 00240 return decContextSetStatus(context, DEC_Division_by_zero); 00241 if (strcmp(string, DEC_Condition_DI)==0) 00242 return decContextSetStatus(context, DEC_Division_impossible); 00243 if (strcmp(string, DEC_Condition_DU)==0) 00244 return decContextSetStatus(context, DEC_Division_undefined); 00245 if (strcmp(string, DEC_Condition_IE)==0) 00246 return decContextSetStatus(context, DEC_Inexact); 00247 if (strcmp(string, DEC_Condition_IS)==0) 00248 return decContextSetStatus(context, DEC_Insufficient_storage); 00249 if (strcmp(string, DEC_Condition_IC)==0) 00250 return decContextSetStatus(context, DEC_Invalid_context); 00251 if (strcmp(string, DEC_Condition_IO)==0) 00252 return decContextSetStatus(context, DEC_Invalid_operation); 00253 #if DECSUBSET 00254 if (strcmp(string, DEC_Condition_LD)==0) 00255 return decContextSetStatus(context, DEC_Lost_digits); 00256 #endif 00257 if (strcmp(string, DEC_Condition_OV)==0) 00258 return decContextSetStatus(context, DEC_Overflow); 00259 if (strcmp(string, DEC_Condition_PA)==0) 00260 return decContextSetStatus(context, DEC_Clamped); 00261 if (strcmp(string, DEC_Condition_RO)==0) 00262 return decContextSetStatus(context, DEC_Rounded); 00263 if (strcmp(string, DEC_Condition_SU)==0) 00264 return decContextSetStatus(context, DEC_Subnormal); 00265 if (strcmp(string, DEC_Condition_UN)==0) 00266 return decContextSetStatus(context, DEC_Underflow); 00267 if (strcmp(string, DEC_Condition_ZE)==0) 00268 return context; 00269 return NULL; // Multiple status, or unknown 00270 } // decContextSetStatusFromString
decContext* decContextSetStatusFromStringQuiet | ( | decContext * | context, | |
const char * | string | |||
) |
Définition à la ligne 286 du fichier decContext.c.
Références DEC_Clamped, DEC_Condition_CS, DEC_Condition_DI, DEC_Condition_DU, DEC_Condition_DZ, DEC_Condition_IC, DEC_Condition_IE, DEC_Condition_IO, DEC_Condition_IS, DEC_Condition_OV, DEC_Condition_PA, DEC_Condition_RO, DEC_Condition_SU, DEC_Condition_UN, DEC_Condition_ZE, DEC_Conversion_syntax, DEC_Division_by_zero, DEC_Division_impossible, DEC_Division_undefined, DEC_Inexact, DEC_Insufficient_storage, DEC_Invalid_context, DEC_Invalid_operation, DEC_Overflow, DEC_Rounded, DEC_Subnormal, DEC_Underflow, et decContextSetStatusQuiet().
00287 { 00288 if (strcmp(string, DEC_Condition_CS)==0) 00289 return decContextSetStatusQuiet(context, DEC_Conversion_syntax); 00290 if (strcmp(string, DEC_Condition_DZ)==0) 00291 return decContextSetStatusQuiet(context, DEC_Division_by_zero); 00292 if (strcmp(string, DEC_Condition_DI)==0) 00293 return decContextSetStatusQuiet(context, DEC_Division_impossible); 00294 if (strcmp(string, DEC_Condition_DU)==0) 00295 return decContextSetStatusQuiet(context, DEC_Division_undefined); 00296 if (strcmp(string, DEC_Condition_IE)==0) 00297 return decContextSetStatusQuiet(context, DEC_Inexact); 00298 if (strcmp(string, DEC_Condition_IS)==0) 00299 return decContextSetStatusQuiet(context, DEC_Insufficient_storage); 00300 if (strcmp(string, DEC_Condition_IC)==0) 00301 return decContextSetStatusQuiet(context, DEC_Invalid_context); 00302 if (strcmp(string, DEC_Condition_IO)==0) 00303 return decContextSetStatusQuiet(context, DEC_Invalid_operation); 00304 #if DECSUBSET 00305 if (strcmp(string, DEC_Condition_LD)==0) 00306 return decContextSetStatusQuiet(context, DEC_Lost_digits); 00307 #endif 00308 if (strcmp(string, DEC_Condition_OV)==0) 00309 return decContextSetStatusQuiet(context, DEC_Overflow); 00310 if (strcmp(string, DEC_Condition_PA)==0) 00311 return decContextSetStatusQuiet(context, DEC_Clamped); 00312 if (strcmp(string, DEC_Condition_RO)==0) 00313 return decContextSetStatusQuiet(context, DEC_Rounded); 00314 if (strcmp(string, DEC_Condition_SU)==0) 00315 return decContextSetStatusQuiet(context, DEC_Subnormal); 00316 if (strcmp(string, DEC_Condition_UN)==0) 00317 return decContextSetStatusQuiet(context, DEC_Underflow); 00318 if (strcmp(string, DEC_Condition_ZE)==0) 00319 return context; 00320 return NULL; // Multiple status, or unknown 00321 } // decContextSetStatusFromStringQuiet
decContext* decContextSetStatusQuiet | ( | decContext * | context, | |
uInt | status | |||
) |
Définition à la ligne 332 du fichier decContext.c.
Références decContext::status.
Référencé par decContextSetStatusFromStringQuiet().
00332 { 00333 context->status|=status; 00334 return context;} // decContextSetStatusQuiet
const char* decContextStatusToString | ( | const decContext * | context | ) |
Définition à la ligne 344 du fichier decContext.c.
Références DEC_Clamped, DEC_Condition_CS, DEC_Condition_DI, DEC_Condition_DU, DEC_Condition_DZ, DEC_Condition_IC, DEC_Condition_IE, DEC_Condition_IO, DEC_Condition_IS, DEC_Condition_MU, DEC_Condition_OV, DEC_Condition_PA, DEC_Condition_RO, DEC_Condition_SU, DEC_Condition_UN, DEC_Condition_ZE, DEC_Conversion_syntax, DEC_Division_by_zero, DEC_Division_impossible, DEC_Division_undefined, DEC_Inexact, DEC_Insufficient_storage, DEC_Invalid_context, DEC_Invalid_operation, DEC_Overflow, DEC_Rounded, DEC_Subnormal, DEC_Underflow, Int, et decContext::status.
Référencé par DecFloatContext::StatusToString().
00344 { 00345 Int status=context->status; 00346 00347 // test the five IEEE first, as some of the others are ambiguous when 00348 // DECEXTFLAG=0 00349 if (status==DEC_Invalid_operation ) return DEC_Condition_IO; 00350 if (status==DEC_Division_by_zero ) return DEC_Condition_DZ; 00351 if (status==DEC_Overflow ) return DEC_Condition_OV; 00352 if (status==DEC_Underflow ) return DEC_Condition_UN; 00353 if (status==DEC_Inexact ) return DEC_Condition_IE; 00354 00355 if (status==DEC_Division_impossible ) return DEC_Condition_DI; 00356 if (status==DEC_Division_undefined ) return DEC_Condition_DU; 00357 if (status==DEC_Rounded ) return DEC_Condition_RO; 00358 if (status==DEC_Clamped ) return DEC_Condition_PA; 00359 if (status==DEC_Subnormal ) return DEC_Condition_SU; 00360 if (status==DEC_Conversion_syntax ) return DEC_Condition_CS; 00361 if (status==DEC_Insufficient_storage ) return DEC_Condition_IS; 00362 if (status==DEC_Invalid_context ) return DEC_Condition_IC; 00363 #if DECSUBSET 00364 if (status==DEC_Lost_digits ) return DEC_Condition_LD; 00365 #endif 00366 if (status==0 ) return DEC_Condition_ZE; 00367 return DEC_Condition_MU; // Multiple errors 00368 } // decContextStatusToString
Int decContextTestEndian | ( | Flag | quiet | ) |
Définition à la ligne 382 du fichier decContext.c.
Références DECLITEND, Int, LITEND, et uInt.
00382 { 00383 Int res=0; // optimist 00384 uInt dle=(uInt)DECLITEND; // unsign 00385 if (dle>1) dle=1; // ensure 0 or 1 00386 00387 if (LITEND!=DECLITEND) { 00388 const char *adj; 00389 if (!quiet) { 00390 if (LITEND) adj="little"; 00391 else adj="big"; 00392 printf("Warning: DECLITEND is set to %d, but this computer appears to be %s-endian\n", 00393 DECLITEND, adj); 00394 } 00395 res=(Int)LITEND-dle; 00396 } 00397 return res; 00398 } // decContextTestEndian
uInt decContextTestSavedStatus | ( | uInt | oldstatus, | |
uInt | mask | |||
) |
uInt decContextTestStatus | ( | decContext * | context, | |
uInt | mask | |||
) |
Définition à la ligne 424 du fichier decContext.c.
Références decContext::status.
00424 { 00425 return (context->status&mask)!=0; 00426 } // decContextTestStatus
decContext* decContextZeroStatus | ( | decContext * | context | ) |
Définition à la ligne 436 du fichier decContext.c.
Références decContext::status.
00436 { 00437 context->status=0; 00438 return context; 00439 } // decContextZeroStatus
const uInt DECPOWERS[10] |
Valeur initiale :
{1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000}
Définition à la ligne 46 du fichier decContext.c.
const uByte DECSTICKYTAB[10] = {1,1,2,3,4,6,6,7,8,9} |
Définition à la ligne 41 du fichier decContext.c.
const Int mfcone = 1 [static] |
Définition à la ligne 34 du fichier decContext.c.
Définition à la ligne 35 du fichier decContext.c.