GnuCash
5.6-150-g038405b370+
|
The 'Numeric' functions provide a way of working with rational numbers while maintaining strict control over rounding errors when adding rationals with different denominators.More...
Files | |
file | gnc-numeric.h |
An exact-rational-number library for gnucash. | |
Data Structures | |
struct | 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 specify 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 } |
How to compute a denominator, or'ed into the "how" field. More... | |
enum | GNCNumericErrorCode { GNC_ERROR_OK = 0, GNC_ERROR_ARG = -1, GNC_ERROR_OVERFLOW = -2, GNC_ERROR_DENOM_DIFF = -3, GNC_ERROR_REMAINDER = -4 } |
Error codes. More... | |
#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) |
Build a 'how' value that will generate a denominator that will keep at least n significant figures in the result. | |
#define | GNC_HOW_GET_SIGFIGS(a) ( (( a ) & 0xff00 ) >> 8) |
#define | GNC_DENOM_AUTO 0 |
Values that can be passed as the 'denom' argument. More... | |
Constructors | |
gnc_numeric | double_to_gnc_numeric (double n, gint64 denom, gint how) |
Convert a floating-point number to a gnc_numeric. More... | |
gnc_numeric | gnc_numeric_from_string (const gchar *str) |
Read a gnc_numeric from str, skipping any leading whitespace. More... | |
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. | |
Value Accessors | |
gdouble | gnc_numeric_to_double (gnc_numeric n) |
Convert numeric to floating-point value. More... | |
gchar * | gnc_numeric_to_string (gnc_numeric n) |
Convert to string. More... | |
gchar * | gnc_num_dbg_to_string (gnc_numeric n) |
Convert to string. More... | |
Comparisons and Predicates | |
GNCNumericErrorCode | gnc_numeric_check (gnc_numeric a) |
Check for error signal in value. More... | |
gint | gnc_numeric_compare (gnc_numeric a, gnc_numeric b) |
Returns 1 if a>b, -1 if b>a, 0 if a == b. | |
gboolean | gnc_numeric_zero_p (gnc_numeric a) |
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0. More... | |
gboolean | gnc_numeric_negative_p (gnc_numeric a) |
Returns 1 if a < 0, otherwise returns 0. More... | |
gboolean | gnc_numeric_positive_p (gnc_numeric a) |
Returns 1 if a > 0, otherwise returns 0. More... | |
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. More... | |
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. More... | |
Arithmetic Operations | |
gnc_numeric | gnc_numeric_add (gnc_numeric a, gnc_numeric b, gint64 denom, gint how) |
Return a+b. More... | |
gnc_numeric | gnc_numeric_sub (gnc_numeric a, gnc_numeric b, gint64 denom, gint how) |
Return a-b. More... | |
gnc_numeric | gnc_numeric_mul (gnc_numeric a, gnc_numeric b, gint64 denom, gint how) |
Multiply a times b, returning the product. More... | |
gnc_numeric | gnc_numeric_div (gnc_numeric x, gnc_numeric y, gint64 denom, gint how) |
Division. More... | |
gnc_numeric | gnc_numeric_neg (gnc_numeric a) |
Returns a newly created gnc_numeric that is the negative of the given gnc_numeric value. More... | |
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. More... | |
Change Denominator | |
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_reduce (gnc_numeric n) |
Return input after reducing it by Greater Common Factor (GCF) elimination. | |
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. More... | |
gnc_numeric | gnc_numeric_invert (gnc_numeric num) |
Invert a gnc_numeric. More... | |
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 245 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 126 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 specify 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 143 of file gnc-numeric.h.
anonymous enum |
How to compute a denominator, or'ed into the "how" field.
Definition at line 181 of file gnc-numeric.h.
enum GNCNumericErrorCode |
Error codes.
Definition at line 221 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.
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. If GNC_DENOM_AUTO is given an appropriate power of ten will be used for the denominator (it may be reduced by rounding if appropriate). |
how | Describes the rounding policy and output denominator. Watch out: You must specify 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). |
Definition at line 1265 of file gnc-numeric.cpp.
gchar* gnc_num_dbg_to_string | ( | gnc_numeric | n | ) |
Convert to string.
Uses a static, non-thread-safe buffer. For internal use only.
Definition at line 1340 of file gnc-numeric.cpp.
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|".
Definition at line 1110 of file gnc-numeric.cpp.
gnc_numeric gnc_numeric_add | ( | gnc_numeric | a, |
gnc_numeric | b, | ||
gint64 | denom, | ||
gint | how | ||
) |
Return a+b.
Definition at line 880 of file gnc-numeric.cpp.
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.
Definition at line 689 of file gnc-numeric.cpp.
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.
Definition at line 1041 of file gnc-numeric.cpp.
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.
Definition at line 825 of file gnc-numeric.cpp.
gnc_numeric gnc_numeric_from_string | ( | const gchar * | str | ) |
Read a gnc_numeric from str, skipping any leading whitespace.
Returns the resulting gnc_numeric. Return GNC_ERROR_ARG on error.
Definition at line 1358 of file gnc-numeric.cpp.
gnc_numeric gnc_numeric_invert | ( | gnc_numeric | num | ) |
Invert a gnc_numeric.
Much faster than dividing 1 by it.
num | The number to be inverted |
Definition at line 1227 of file gnc-numeric.cpp.
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.
Definition at line 986 of file gnc-numeric.cpp.
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".
Definition at line 1095 of file gnc-numeric.cpp.
gboolean gnc_numeric_negative_p | ( | gnc_numeric | a | ) |
Returns 1 if a < 0, otherwise returns 0.
Definition at line 739 of file gnc-numeric.cpp.
gboolean gnc_numeric_positive_p | ( | gnc_numeric | a | ) |
Returns 1 if a > 0, otherwise returns 0.
Definition at line 763 of file gnc-numeric.cpp.
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.
Definition at line 852 of file gnc-numeric.cpp.
gnc_numeric gnc_numeric_sub | ( | gnc_numeric | a, |
gnc_numeric | b, | ||
gint64 | denom, | ||
gint | how | ||
) |
Return a-b.
Definition at line 933 of file gnc-numeric.cpp.
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. Definition at line 1206 of file gnc-numeric.cpp.
gdouble gnc_numeric_to_double | ( | gnc_numeric | n | ) |
Convert numeric to floating-point value.
Definition at line 1299 of file gnc-numeric.cpp.
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)
Definition at line 1328 of file gnc-numeric.cpp.
gboolean gnc_numeric_zero_p | ( | gnc_numeric | a | ) |
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
Definition at line 715 of file gnc-numeric.cpp.