diff --git a/ChangeLog b/ChangeLog index 946b92a068..c6f51141fb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-01-08 Derek Atkins + + * apply patch to use Euclid's algo for gnc_numeric_reduce + more fixes for #95474 + 2003-01-08 Christian Stimming * po/ru.po: Updated very complete (!) Russian translation by diff --git a/src/engine/gnc-numeric.c b/src/engine/gnc-numeric.c index 9e72dcc5f3..b66d41d802 100644 --- a/src/engine/gnc-numeric.c +++ b/src/engine/gnc-numeric.c @@ -727,6 +727,33 @@ gnc_numeric_lcd(gnc_numeric a, gnc_numeric b) { * as the output denominator. ********************************************************************/ +gnc_numeric +gnc_numeric_reduce(gnc_numeric in) { + gint64 t; + gint64 num = (in.num < 0) ? (- in.num) : in.num ; + gint64 denom = in.denom; + gnc_numeric out; + + if(gnc_numeric_check(in)) { + return gnc_numeric_error(GNC_ERROR_ARG); + } + + /* the strategy is to use euclid's algorithm */ + while (denom > 0) { + t = num % denom; + num = denom; + denom = t; + } + /* num = gcd */ + + /* all calculations are done on positive num, since it's not + * well defined what % does for negative values */ + out.num = in.num / num; + out.denom = in.denom / num; + return out; +} + +#if 0 gnc_numeric gnc_numeric_reduce(gnc_numeric in) { @@ -800,6 +827,7 @@ gnc_numeric_reduce(gnc_numeric in) { out.denom = denom; return out; } +#endif /******************************************************************** * double_to_gnc_numeric