GnuCash
2.6.99
|
Files | |
file | gnc-numeric.h |
An exact-rational-number library for gnucash. (to be renamed qofnumeric.h in libqof2) | |
Data Structures | |
struct | _gnc_numeric |
Typedefs | |
typedef struct _gnc_numeric | gnc_numeric |
An rational-number type. More... | |
Variables | |
gint64 | _gnc_numeric::num |
gint64 | _gnc_numeric::denom |
Arguments Standard Arguments to most functions | |
Most of the gnc_numeric arithmetic functions take two arguments in addition to their numeric args: 'denom', which is the denominator to use in the output gnc_numeric object, and 'how'. which describes how the arithmetic result is to be converted to that denominator. This combination of output denominator and rounding policy allows the results of financial and other rational computations to be properly rounded to the appropriate units. Watch out: You must specifiy a rounding policy such as GNC_HOW_RND_NEVER, otherwise the fractional part of the input value might silently get discarded! Valid values for denom are: GNC_DENOM_AUTO – compute denominator exactly integer n – Force the denominator of the result to be this integer GNC_DENOM_RECIPROCAL – Use 1/n as the denominator (???huh???) Valid values for 'how' are bitwise combinations of zero or one "rounding instructions" with zero or one "denominator types". Valid rounding instructions are: GNC_HOW_RND_FLOOR GNC_HOW_RND_CEIL GNC_HOW_RND_TRUNC GNC_HOW_RND_PROMOTE GNC_HOW_RND_ROUND_HALF_DOWN GNC_HOW_RND_ROUND_HALF_UP GNC_HOW_RND_ROUND GNC_HOW_RND_NEVER The denominator type specifies how to compute a denominator if GNC_DENOM_AUTO is specified as the 'denom'. Valid denominator types are: GNC_HOW_DENOM_EXACT GNC_HOW_DENOM_REDUCE GNC_HOW_DENOM_LCD GNC_HOW_DENOM_FIXED GNC_HOW_DENOM_SIGFIGS(N) To use traditional rational-number operational semantics (all results are exact and are reduced to relatively-prime fractions) pass the argument GNC_DENOM_AUTO as 'denom' and GNC_HOW_DENOM_REDUCE| GNC_HOW_RND_NEVER as 'how'. To enforce strict financial semantics (such that all operands must have the same denominator as each other and as the result), use GNC_DENOM_AUTO as 'denom' and GNC_HOW_DENOM_FIXED | GNC_HOW_RND_NEVER as 'how'. | |
enum | { GNC_HOW_RND_FLOOR = 0x01, GNC_HOW_RND_CEIL = 0x02, GNC_HOW_RND_TRUNC = 0x03, GNC_HOW_RND_PROMOTE = 0x04, GNC_HOW_RND_ROUND_HALF_DOWN = 0x05, GNC_HOW_RND_ROUND_HALF_UP = 0x06, GNC_HOW_RND_ROUND = 0x07, GNC_HOW_RND_NEVER = 0x08 } |
Rounding/Truncation modes for operations. More... | |
enum | { GNC_HOW_DENOM_EXACT = 0x10, GNC_HOW_DENOM_REDUCE = 0x20, GNC_HOW_DENOM_LCD = 0x30, GNC_HOW_DENOM_FIXED = 0x40, GNC_HOW_DENOM_SIGFIG = 0x50 } |
enum | GNCNumericErrorCode { GNC_ERROR_OK = 0, GNC_ERROR_ARG = -1, GNC_ERROR_OVERFLOW = -2, GNC_ERROR_DENOM_DIFF = -3, GNC_ERROR_REMAINDER = -4 } |
#define | GNC_NUMERIC_RND_MASK 0x0000000f |
bitmasks for HOW flags. More... | |
#define | GNC_NUMERIC_DENOM_MASK 0x000000f0 |
#define | GNC_NUMERIC_SIGFIGS_MASK 0x0000ff00 |
#define | GNC_HOW_DENOM_SIGFIGS(n) ( ((( n ) & 0xff) << 8) | GNC_HOW_DENOM_SIGFIG) |
#define | GNC_HOW_GET_SIGFIGS(a) ( (( a ) & 0xff00 ) >> 8) |
#define | GNC_DENOM_AUTO 0 |
#define | GNC_DENOM_RECIPROCAL(a) (- ( a )) |
Constructors | |
gnc_numeric | double_to_gnc_numeric (double n, gint64 denom, gint how) |
gboolean | string_to_gnc_numeric (const gchar *str, gnc_numeric *n) |
gnc_numeric | gnc_numeric_error (GNCNumericErrorCode error_code) |
const char * | gnc_numeric_errorCode_to_string (GNCNumericErrorCode error_code) |
Value Accessors | |
gdouble | gnc_numeric_to_double (gnc_numeric n) |
gchar * | gnc_numeric_to_string (gnc_numeric n) |
gchar * | gnc_num_dbg_to_string (gnc_numeric n) |
Comparisons and Predicates | |
GNCNumericErrorCode | gnc_numeric_check (gnc_numeric a) |
gint | gnc_numeric_compare (gnc_numeric a, gnc_numeric b) |
gboolean | gnc_numeric_zero_p (gnc_numeric a) |
gboolean | gnc_numeric_negative_p (gnc_numeric a) |
gboolean | gnc_numeric_positive_p (gnc_numeric a) |
gboolean | gnc_numeric_eq (gnc_numeric a, gnc_numeric b) |
gboolean | gnc_numeric_equal (gnc_numeric a, gnc_numeric b) |
gint | gnc_numeric_same (gnc_numeric a, gnc_numeric b, gint64 denom, gint how) |
Arithmetic Operations | |
gnc_numeric | gnc_numeric_add (gnc_numeric a, gnc_numeric b, gint64 denom, gint how) |
gnc_numeric | gnc_numeric_sub (gnc_numeric a, gnc_numeric b, gint64 denom, gint how) |
gnc_numeric | gnc_numeric_mul (gnc_numeric a, gnc_numeric b, gint64 denom, gint how) |
gnc_numeric | gnc_numeric_div (gnc_numeric x, gnc_numeric y, gint64 denom, gint how) |
gnc_numeric | gnc_numeric_neg (gnc_numeric a) |
gnc_numeric | gnc_numeric_abs (gnc_numeric a) |
Arithmetic Functions with Exact Error Returns | |
gnc_numeric | gnc_numeric_add_with_error (gnc_numeric a, gnc_numeric b, gint64 denom, gint how, gnc_numeric *error) |
gnc_numeric | gnc_numeric_sub_with_error (gnc_numeric a, gnc_numeric b, gint64 denom, gint how, gnc_numeric *error) |
gnc_numeric | gnc_numeric_mul_with_error (gnc_numeric a, gnc_numeric b, gint64 denom, gint how, gnc_numeric *error) |
gnc_numeric | gnc_numeric_div_with_error (gnc_numeric a, gnc_numeric b, gint64 denom, gint how, gnc_numeric *error) |
Change Denominator | |
gnc_numeric | gnc_numeric_convert (gnc_numeric n, gint64 denom, gint how) |
gnc_numeric | gnc_numeric_reduce (gnc_numeric n) |
gboolean | gnc_numeric_to_decimal (gnc_numeric *a, guint8 *max_decimal_places) |
GValue | |
GType | gnc_numeric_get_type (void) |
#define | GNC_TYPE_NUMERIC (gnc_numeric_get_type ()) |
The 'Numeric' functions provide a way of working with rational numbers while maintaining strict control over rounding errors when adding rationals with different denominators. The Numeric class is primarily used for working with monetary amounts, where the denominator typically represents the smallest fraction of the currency (e.g. pennies, centimes). The numeric class can handle any fraction (e.g. twelfth's) and is not limited to fractions that are powers of ten.
A 'Numeric' value represents a number in rational form, with a 64-bit integer as numerator and denominator. Rationals are ideal for many uses, such as performing exact, roundoff-error-free addition and multiplication, but 64-bit rationals do not have the dynamic range of floating point numbers.
#define GNC_DENOM_AUTO 0 |
Values that can be passed as the 'denom' argument. The include a positive number n to be used as the denominator of the output value. Other possibilities include the list below:Compute an appropriate denominator automatically. Flags in the 'how' argument will specify how to compute the denominator.
Definition at line 246 of file gnc-numeric.h.
#define GNC_DENOM_RECIPROCAL | ( | a | ) | (- ( a )) |
Use the value 1/n as the denominator of the output value.
Definition at line 249 of file gnc-numeric.h.
#define GNC_HOW_DENOM_SIGFIGS | ( | n | ) | ( ((( n ) & 0xff) << 8) | GNC_HOW_DENOM_SIGFIG) |
Build a 'how' value that will generate a denominator that will keep at least n significant figures in the result.
Definition at line 218 of file gnc-numeric.h.
#define GNC_NUMERIC_RND_MASK 0x0000000f |
bitmasks for HOW flags.
bits 8-15 of 'how' are reserved for the number of significant digits to use in the output with GNC_HOW_DENOM_SIGFIG
Definition at line 127 of file gnc-numeric.h.
typedef struct _gnc_numeric gnc_numeric |
An rational-number type.
This is a rational number, defined by numerator and denominator.
Definition at line 68 of file gnc-numeric.h.
anonymous enum |
Rounding/Truncation modes for operations.
Rounding instructions control how fractional parts in the specified denominator affect the result. For example, if a computed result is "3/4" but the specified denominator for the return value is 2, should the return value be "1/2" or "2/2"?
Watch out: You must specifiy a rounding policy such as GNC_HOW_RND_NEVER, otherwise the fractional part of the input value might silently get discarded!
Possible rounding instructions are:
Definition at line 144 of file gnc-numeric.h.
anonymous enum |
How to compute a denominator, or'ed into the "how" field.
Definition at line 182 of file gnc-numeric.h.
enum GNCNumericErrorCode |
Error codes
Definition at line 222 of file gnc-numeric.h.
gnc_numeric double_to_gnc_numeric | ( | double | n, |
gint64 | denom, | ||
gint | how | ||
) |
Convert a floating-point number to a gnc_numeric.
Both 'denom' and 'how' are used as in arithmetic, but GNC_DENOM_AUTO is not recognized; a denominator must be specified either explicitly or through sigfigs.
n | The double value that is converted into a gnc_numeric |
denom | The denominator of the gnc_numeric return value. If the 'how' argument contains the GNC_HOW_DENOM_SIGFIG flag, this value will be ignored. |
how | Describes the rounding policy and output denominator. Watch out: You must specifiy a rounding policy such as GNC_HOW_RND_NEVER, otherwise the fractional part of the input value is silently discarded! Common values for 'how' are (GNC_HOW_DENOM_REDUCE|GNC_HOW_RND_NEVER) or (GNC_HOW_DENOM_FIXED|GNC_HOW_RND_NEVER). As mentioned above, GNC_DENOM_AUTO is not allowed here. |
gchar* gnc_num_dbg_to_string | ( | gnc_numeric | n | ) |
Convert to string. Uses a static, non-thread-safe buffer. For internal use only.
gnc_numeric gnc_numeric_abs | ( | gnc_numeric | a | ) |
Returns a newly created gnc_numeric that is the absolute value of the given gnc_numeric value. For a given gnc_numeric "a/b" the returned value is "|a/b|".
gnc_numeric gnc_numeric_add | ( | gnc_numeric | a, |
gnc_numeric | b, | ||
gint64 | denom, | ||
gint | how | ||
) |
Return a+b.
gnc_numeric gnc_numeric_add_with_error | ( | gnc_numeric | a, |
gnc_numeric | b, | ||
gint64 | denom, | ||
gint | how, | ||
gnc_numeric * | error | ||
) |
The same as gnc_numeric_add, but uses 'error' for accumulating conversion roundoff error.
GNCNumericErrorCode gnc_numeric_check | ( | gnc_numeric | a | ) |
Check for error signal in value. Returns GNC_ERROR_OK (==0) if the number appears to be valid, otherwise it returns the type of error. Error values always have a denominator of zero.
gint gnc_numeric_compare | ( | gnc_numeric | a, |
gnc_numeric | b | ||
) |
Returns 1 if a>b, -1 if b>a, 0 if a == b
gnc_numeric gnc_numeric_convert | ( | gnc_numeric | n, |
gint64 | denom, | ||
gint | how | ||
) |
Change the denominator of a gnc_numeric value to the specified denominator under standard arguments 'denom' and 'how'.
gnc_numeric gnc_numeric_div | ( | gnc_numeric | x, |
gnc_numeric | y, | ||
gint64 | denom, | ||
gint | how | ||
) |
Division. Note that division can overflow, in the following sense: if we write x=a/b and y=c/d then x/y = (a*d)/(b*c) If, after eliminating all common factors between the numerator (a*d) and the denominator (b*c), then if either the numerator and/or the denominator are still greater than 2^63, then the division has overflowed.
gnc_numeric gnc_numeric_div_with_error | ( | gnc_numeric | a, |
gnc_numeric | b, | ||
gint64 | denom, | ||
gint | how, | ||
gnc_numeric * | error | ||
) |
The same as gnc_numeric_div, but uses error for accumulating conversion roundoff error.
gboolean gnc_numeric_eq | ( | gnc_numeric | a, |
gnc_numeric | b | ||
) |
Equivalence predicate: Returns TRUE (1) if a and b are exactly the same (have the same numerator and denominator)
gboolean gnc_numeric_equal | ( | gnc_numeric | a, |
gnc_numeric | b | ||
) |
Equivalence predicate: Returns TRUE (1) if a and b represent the same number. That is, return TRUE if the ratios, when reduced by eliminating common factors, are identical.
gnc_numeric gnc_numeric_error | ( | GNCNumericErrorCode | error_code | ) |
Create a gnc_numeric object that signals the error condition noted by error_code, rather than a number.
const char* gnc_numeric_errorCode_to_string | ( | GNCNumericErrorCode | error_code | ) |
Returns a string representation of the given GNCNumericErrorCode.
gnc_numeric gnc_numeric_mul | ( | gnc_numeric | a, |
gnc_numeric | b, | ||
gint64 | denom, | ||
gint | how | ||
) |
Multiply a times b, returning the product. An overflow may occur if the result of the multiplication can't be represented as a ratio of 64-bit int's after removing common factors.
gnc_numeric gnc_numeric_mul_with_error | ( | gnc_numeric | a, |
gnc_numeric | b, | ||
gint64 | denom, | ||
gint | how, | ||
gnc_numeric * | error | ||
) |
The same as gnc_numeric_mul, but uses error for accumulating conversion roundoff error.
gnc_numeric gnc_numeric_neg | ( | gnc_numeric | a | ) |
Returns a newly created gnc_numeric that is the negative of the given gnc_numeric value. For a given gnc_numeric "a/b" the returned value is "-a/b".
gboolean gnc_numeric_negative_p | ( | gnc_numeric | a | ) |
Returns 1 if a < 0, otherwise returns 0.
gboolean gnc_numeric_positive_p | ( | gnc_numeric | a | ) |
Returns 1 if a > 0, otherwise returns 0.
gnc_numeric gnc_numeric_reduce | ( | gnc_numeric | n | ) |
Return input after reducing it by Greated Common Factor (GCF) elimination
gint gnc_numeric_same | ( | gnc_numeric | a, |
gnc_numeric | b, | ||
gint64 | denom, | ||
gint | how | ||
) |
Equivalence predicate: Convert both a and b to denom using the specified DENOM and method HOW, and compare numerators the results using gnc_numeric_equal.
For example, if a == 7/16 and b == 3/4, gnc_numeric_same(a, b, 2, GNC_HOW_RND_TRUNC) == 1 because both 7/16 and 3/4 round to 1/2 under truncation. However, gnc_numeric_same(a, b, 2, GNC_HOW_RND_ROUND) == 0 because 7/16 rounds to 1/2 under unbiased rounding but 3/4 rounds to 2/2.
gnc_numeric gnc_numeric_sub | ( | gnc_numeric | a, |
gnc_numeric | b, | ||
gint64 | denom, | ||
gint | how | ||
) |
Return a-b.
gnc_numeric gnc_numeric_sub_with_error | ( | gnc_numeric | a, |
gnc_numeric | b, | ||
gint64 | denom, | ||
gint | how, | ||
gnc_numeric * | error | ||
) |
The same as gnc_numeric_sub, but uses error for accumulating conversion roundoff error.
gboolean gnc_numeric_to_decimal | ( | gnc_numeric * | a, |
guint8 * | max_decimal_places | ||
) |
Attempt to convert the denominator to an exact power of ten without rounding.
a | the gnc_numeric value to convert |
max_decimal_places | the number of decimal places of the converted value. This parameter may be NULL . |
TRUE
if a has been converted or was already decimal. Otherwise, FALSE
is returned and a and max_decimal_places remain unchanged. gdouble gnc_numeric_to_double | ( | gnc_numeric | n | ) |
Convert numeric to floating-point value.
gchar* gnc_numeric_to_string | ( | gnc_numeric | n | ) |
Convert to string. The returned buffer is to be g_free'd by the caller (it was allocated through g_strdup)
gboolean gnc_numeric_zero_p | ( | gnc_numeric | a | ) |
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
gboolean string_to_gnc_numeric | ( | const gchar * | str, |
gnc_numeric * | n | ||
) |
Read a gnc_numeric from str, skipping any leading whitespace. Return TRUE on success and store the resulting value in "n". Return NULL on error.