github.com/matrixorigin/matrixone@v0.7.0/cgo/external/decNumber/example3.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 // example3.c -- calculate compound interest, passive checking 9 // Arguments are investment, rate (%), and years 10 11 #define DECNUMDIGITS 38 // work with up to 38 digits 12 #include "decNumber.h" // base number library 13 #include <stdio.h> // for printf 14 15 int main(int argc, char *argv[]) { 16 int need=3; 17 if (argc<need+1) { // not enough words 18 printf("Please supply %d number(s).\n", need); 19 return 1; 20 } 21 22 { // start of Example 2 segment 23 decNumber one, mtwo, hundred; // constants 24 decNumber start, rate, years; // parameters 25 decNumber total; // result 26 decContext set; // working context 27 char string[DECNUMDIGITS+14]; // conversion buffer 28 29 decContextDefault(&set, DEC_INIT_BASE); // initialize 30 set.traps=0; // no traps 31 set.digits=25; // precision 25 32 decNumberFromString(&one, "1", &set); // set constants 33 decNumberFromString(&mtwo, "-2", &set); 34 decNumberFromString(&hundred, "100", &set); 35 36 // [snip... 37 decNumberFromString(&start, argv[1], &set); // parameter words 38 decNumberFromString(&rate, argv[2], &set); 39 decNumberFromString(&years, argv[3], &set); 40 if (set.status & DEC_Errors) { 41 printf("An input argument word was invalid [%s]\n", 42 decContextStatusToString(&set)); 43 return 1; 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 if (set.status & DEC_Errors) { 51 set.status &= DEC_Errors; // keep only errors 52 printf("Result could not be calculated [%s]\n", 53 decContextStatusToString(&set)); 54 return 1; 55 } 56 // ...snip] 57 58 decNumberToString(&total, string); 59 printf("%s at %s%% for %s years => %s\n", 60 argv[1], argv[2], argv[3], string); 61 62 } //---------------------------------------------------------------| 63 return 0; 64 } // main