QOF
0.8.7
|
The following program finds the best QofNumeric approximation to the math.h constant M_PI given a maximum denominator. For large denominators, the QofNumeric approximation is accurate to more decimal places than will generally be needed, but in some cases this may not be good enough. For example,
M_PI = 3.14159265358979323846 245850922 / 78256779 = 3.14159265358979311599 (16 sig figs) 3126535 / 995207 = 3.14159265358865047446 (12 sig figs) 355 / 113 = 3.14159292035398252096 (7 sig figs)
#include <glib.h> #include <qof.h> #include <math.h> int main(int argc, char ** argv) { QofNumeric approx, best; gdouble err, best_err=1.0; gdouble m_pi = M_PI; gint64 denom; gint64 max; sscanf(argv[1], "%Ld", &max); for (denom = 1; denom < max; denom++) { approx = qof_numeric_from_double (m_pi, denom, GNC_RND_ROUND); err = m_pi - qof_numeric_to_double (approx); if (fabs (err) < fabs (best_err)) { best = approx; best_err = err; printf ("%Ld / %Ld = %.30f\n", qof_numeric_num (best), qof_numeric_denom (best), qof_numeric_to_double (best)); } } }