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