Avoid gratuitous inaccuracy in numeric width_bucket().
Tom Lane <tgl@sss.pgh.pa.us>
Avoid gratuitous inaccuracy in numeric width_bucket(). Multiply before dividing, not the reverse, so that cases that should produce exact results do produce exact results. (width_bucket_float8 got this right already.) Even when the result is inexact, this avoids making it more inexact, since only the division step introduces any imprecision. While at it, fix compute_bucket() to not uselessly repeat the sign check already done by its caller, and avoid duplicating the multiply/divide steps by adjusting variable usage. Per complaint from Martin Visser. Although this seems like a bug fix, I'm hesitant to risk changing width_bucket()'s results in stable branches, so no back-patch. Discussion: https://postgr.es/m/6FA5117D-6AED-4656-8FEF-B74AC18FAD85@brytlyt.com
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/utils/adt/numeric.c | modified | +16 −15 |
| src/test/regress/expected/numeric.out | modified | +40 −0 |
| src/test/regress/sql/numeric.sql | modified | +9 −0 |
Discussion
- WIDTH_BUCKET inconsistency 3 messages · 2020-10-08