github.com/matrixorigin/matrixone@v0.7.0/cgo/external/decNumber/example6.c (about) 1 /* ------------------------------------------------------------------ */ 2 /* Decimal Number Library Demonstration program */ 3 /* ------------------------------------------------------------------ */ 4 /* Copyright (c) IBM Corporation, 2001. All rights reserved. */ 5 /* ----------------------------------------------------------------+- */ 6 /* right margin -->| */ 7 8 // example6.c -- calculate compound interest, using Packed Decimal 9 // Values are investment, rate (%), and years 10 11 #include "decPacked.h" // base number library 12 #include <stdio.h> // for printf 13 14 int main(int argc, char *argv[]) { 15 { // excerpt for User's Guide starts here--------------------------| 16 decNumber one, mtwo, hundred; // constants 17 decNumber start, rate, years; // parameters 18 decNumber total; // result 19 decContext set; // working context 20 21 uint8_t startpack[]={0x01, 0x00, 0x00, 0x0C}; // investment=100000 22 int32_t startscale=0; 23 uint8_t ratepack[]={0x06, 0x5C}; // rate=6.5% 24 int32_t ratescale=1; 25 uint8_t yearspack[]={0x02, 0x0C}; // years=20 26 int32_t yearsscale=0; 27 uint8_t respack[16]; // result, packed 28 int32_t resscale; // .. 29 char hexes[49]; // for packed->hex 30 int i; // counter 31 32 if (argc<0) printf("%s", argv[1]); // noop for warning 33 34 decContextDefault(&set, DEC_INIT_BASE); // initialize 35 set.traps=0; // no traps 36 set.digits=25; // precision 25 37 decNumberFromString(&one, "1", &set); // set constants 38 decNumberFromString(&mtwo, "-2", &set); 39 decNumberFromString(&hundred, "100", &set); 40 41 decPackedToNumber(startpack, sizeof(startpack), &startscale, &start); 42 decPackedToNumber(ratepack, sizeof(ratepack), &ratescale, &rate); 43 decPackedToNumber(yearspack, sizeof(yearspack), &yearsscale, &years); 44 45 decNumberDivide(&rate, &rate, &hundred, &set); // rate=rate/100 46 decNumberAdd(&rate, &rate, &one, &set); // rate=rate+1 47 decNumberPower(&rate, &rate, &years, &set); // rate=rate^years 48 decNumberMultiply(&total, &rate, &start, &set); // total=rate*start 49 decNumberRescale(&total, &total, &mtwo, &set); // two digits please 50 51 decPackedFromNumber(respack, sizeof(respack), &resscale, &total); 52 53 // lay out the total as sixteen hexadecimal pairs 54 for (i=0; i<16; i++) { 55 sprintf(&hexes[i*3], "%02x ", respack[i]); 56 } 57 printf("Result: %s (scale=%ld)\n", hexes, (long int)resscale); 58 59 } //---------------------------------------------------------------| 60 return 0; 61 } // main