Fix gnc_numeric_invert to correctly handle negative values.

This commit is contained in:
John Ralls 2015-08-31 13:39:37 -07:00
parent c068397633
commit 86320a4d11

View File

@ -1154,9 +1154,21 @@ gnc_numeric_invert(gnc_numeric num)
{
if (num.num == 0)
return gnc_numeric_zero();
return gnc_numeric_create (num.denom, num.num);
if (num.denom > 0)
{
if (num.num < 0)
return gnc_numeric_create (-num.denom, -num.num);
return gnc_numeric_create (num.denom, num.num);
}
else /* Negative denominator means multiply instead of divide. */
{
int64_t mult = (num.num < 0 ? INT64_C(-1) : INT64_C(1));
qofint128 denom = mult128(-num.denom, mult * num.num);
if (denom.hi)
return gnc_numeric_error(GNC_ERROR_OVERFLOW);
return gnc_numeric_create (mult, denom.lo);
}
}
/* *******************************************************************
* double_to_gnc_numeric
********************************************************************/