d025cfd6c5
Change a round to a truncate. Problem reported from Christoph Kukulies: 9.8 2 / p did an IOT trap. There is one remaining problem.: 9.8 2 % p shows on other machines 1.8 but does here in the moment 1.
94 lines
3.1 KiB
C
94 lines
3.1 KiB
C
/*
|
|
* Header file for decimal.c (arbitrary precision decimal arithmetic)
|
|
*
|
|
* Copyright (C) 1984 Free Software Foundation, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, you can either send email to this
|
|
* program's author (see below) or write to: The Free Software Foundation,
|
|
* Inc.; 675 Mass Ave. Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
/* Autoconf stuff */
|
|
#ifndef HAVE_BCOPY
|
|
#undef bcopy
|
|
#define bcopy(s2, s1, n) memcpy (s1, s2, n)
|
|
#endif
|
|
|
|
#ifndef HAVE_BZERO
|
|
#undef bzero
|
|
#define bzero(b, l) memset (b, 0, l)
|
|
#endif
|
|
|
|
/* Define the radix to use by default, and for representing the
|
|
numbers internally. This does not need to be decimal; that is just
|
|
the default for it. */
|
|
|
|
/* Currently, this is required to be even for this program to work. */
|
|
|
|
#ifndef RADIX
|
|
#define RADIX 10
|
|
#endif
|
|
|
|
/* The user must define the external function `decimal_error'
|
|
which is called with two arguments to report errors in this package.
|
|
The two arguments may be passed to `printf' to print a message. */
|
|
|
|
/* Structure that represents a decimal number */
|
|
|
|
struct decimal
|
|
{
|
|
unsigned int sign: 1; /* One for negative number */
|
|
/* The sign should always be zero for the number 0 */
|
|
int after: 15; /* number of fraction digits */
|
|
unsigned short before; /* number of non-fraction digits */
|
|
unsigned short refcnt; /* number of pointers to this number */
|
|
/* (used by calling program) */
|
|
char contents[1]; /* the digits themselves, least significant first. */
|
|
/* digits are just numbers 0 .. RADIX-1 */
|
|
};
|
|
|
|
/* There may never be leading nonfraction zeros or trailing fraction
|
|
zeros in a number. They must be removed by all the arithmetic
|
|
functions. Therefore, the number zero always has no digits stored. */
|
|
|
|
typedef struct decimal *decimal;
|
|
|
|
/* Decimal numbers are always passed around as pointers.
|
|
All the external entries in this file allocate new numbers
|
|
using `malloc' to store values in.
|
|
They never modify their arguments or any existing numbers. */
|
|
|
|
/* Return the total number of digits stored in the number `b' */
|
|
#define LENGTH(b) ((b)->before + (b)->after)
|
|
|
|
/* Some constant decimal numbers */
|
|
|
|
|
|
#define DECIMAL_ZERO &decimal_zero
|
|
|
|
|
|
#define DECIMAL_ONE &decimal_one
|
|
|
|
#define DECIMAL_HALF &decimal_half
|
|
|
|
decimal decimal_add (), decimal_sub (), decimal_mul (), decimal_div ();
|
|
decimal decimal_mul_dc (), decimal_mul_rounded (), decimal_rem ();
|
|
decimal decimal_round_digits (), decimal_trunc_digits ();
|
|
decimal make_decimal (), decimal_copy (), decimal_parse ();
|
|
decimal decimal_sqrt (), decimal_expt ();
|
|
|
|
void decimal_print ();
|
|
|
|
/* End of decimal.h */
|