HP aC++/HP ANSI C A.06.27 Release Notes

* This program is intended to illustrate how C decimal FP might be
* used in a commercial billing program.
*
* The program reads input data from a file, interprets each datum
* as a number of service minutes, converts to hours (rounding up to
* the nearest tenth of an hour), and multiplies by a billing rate
* (rounding to the nearest cent with halfway cases rounding away
* from zero). For each inputl, the program writes the billing amount
* as an ASCII character string to a file. Along the way, it
* accumulates sums of service minutes, hours billed, and amounts
* billed, and at the end writes the total sums to stdout.
*
* Program constants determine the input and output filenames and
* whether the input is ASCII, BID ("binary" encoding for decimal FP),
* or DPD ("decimal" encoding for decimal FP). The HP-UX
* implementation uses BID encoding for its decimal FP types.
*
**********************************************************************/
const char * ifilename = "biller.in"; // input file
const char * ofilename = "biller.out"; // output file
const enum { ascii, bid, dpd } encoding = ascii; // input encoding
const _Decimal64 rate = 149.95DD; // hourly billing rate
#define __STDC_WANT_DEC_FP__
#include <stdio.h>
#include <std.lib.h>
#include <math.h>
#include <fenv.h>
#include <strtodec.h>
#include <assert.h>
#pragma STDC FENV_ACCESS ON
int main() {
unsigned int n; // number of inputs
_Decimal64 m; // number of minutes
_Decimal64 h; // number of hours
_Decimal64 b; // amount billed
_Decimal64 sumM, sumH, sumB; // sums
const _Decimal64 onert = 0.0DD; // for rounding to tenths
const _Decimal64 twort = 0.00DD; // for rounding to hundredths
FILE *inp=NULL; // input stream
FILE *outp=NULL; // output stream
int r, s; // fread, scanf returns
_Binaryencoding64 be; // for binary-encoded (bid) input
_Decimalencoding64 de; // for decimal-encoded (dpd) input
// open input file
if (encoding == ascii)
inp = fopen(ifilename, "r");
else
inp = fopen(ifilename, "rb");
if (inp == NULL) {
fprintf(stderr, "FAILURE: could not open %s\n", ifilename);
exit(EXIT_FAILURE);
}
// open output file
outp = fopen(ofilename, "w");
if (outp == NULL) {
fprintf(stderr, "FAILURE: could not open %s\n", ofilename);
exit(EXIT_FAILURE);
26 Product changes in earlier versions