/* ------------------------------------------------------------------ */ | |
/* Decimal Number Library Demonstration program */ | |
/* ------------------------------------------------------------------ */ | |
/* Copyright (c) IBM Corporation, 2001. All rights reserved. */ | |
/* ----------------------------------------------------------------+- */ | |
/* right margin -->| */ | |
// example3.c -- calculate compound interest, passive checking | |
// Arguments are investment, rate (%), and years | |
#define DECNUMDIGITS 38 // work with up to 38 digits | |
#include "decNumber.h" // base number library | |
#include <stdio.h> // for printf | |
int main(int argc, char *argv[]) { | |
int need=3; | |
if (argc<need+1) { // not enough words | |
printf("Please supply %d number(s).\n", need); | |
return 1; | |
} | |
{ // start of Example 2 segment | |
decNumber one, mtwo, hundred; // constants | |
decNumber start, rate, years; // parameters | |
decNumber total; // result | |
decContext set; // working context | |
char string[DECNUMDIGITS+14]; // conversion buffer | |
decContextDefault(&set, DEC_INIT_BASE); // initialize | |
set.traps=0; // no traps | |
set.digits=25; // precision 25 | |
decNumberFromString(&one, "1", &set); // set constants | |
decNumberFromString(&mtwo, "-2", &set); | |
decNumberFromString(&hundred, "100", &set); | |
// [snip... | |
decNumberFromString(&start, argv[1], &set); // parameter words | |
decNumberFromString(&rate, argv[2], &set); | |
decNumberFromString(&years, argv[3], &set); | |
if (set.status & DEC_Errors) { | |
printf("An input argument word was invalid [%s]\n", | |
decContextStatusToString(&set)); | |
return 1; | |
} | |
decNumberDivide(&rate, &rate, &hundred, &set); // rate=rate/100 | |
decNumberAdd(&rate, &rate, &one, &set); // rate=rate+1 | |
decNumberPower(&rate, &rate, &years, &set); // rate=rate^years | |
decNumberMultiply(&total, &rate, &start, &set); // total=rate*start | |
decNumberRescale(&total, &total, &mtwo, &set); // two digits please | |
if (set.status & DEC_Errors) { | |
set.status &= DEC_Errors; // keep only errors | |
printf("Result could not be calculated [%s]\n", | |
decContextStatusToString(&set)); | |
return 1; | |
} | |
// ...snip] | |
decNumberToString(&total, string); | |
printf("%s at %s%% for %s years => %s\n", | |
argv[1], argv[2], argv[3], string); | |
} //---------------------------------------------------------------| | |
return 0; | |
} // main |