Re: Incorrect rounding of double values at max precision
От | Andres Freund |
---|---|
Тема | Re: Incorrect rounding of double values at max precision |
Дата | |
Msg-id | 20201021011725.kmnkgj7ghedjre6j@alap3.anarazel.de обсуждение исходный текст |
Ответ на | Re: Incorrect rounding of double values at max precision (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: Incorrect rounding of double values at max precision
|
Список | pgsql-bugs |
Hi, Re-found this thread due to https://postgr.es/m/CH2PR19MB3798B24BCC34D3F9949F629C83000%40CH2PR19MB3798.namprd19.prod.outlook.com On 2019-10-21 22:41:11 -0400, Tom Lane wrote: > Andrew Gierth <andrew@tao11.riddles.org.uk> writes: > > The Ryu output values will still throw out edge cases similar to the > > above; for example, 502.15::float8 / 10 = 50.214999999999996 whereas > > 502.15::numeric / 10 = 50.215, so rounding the result of that to 2 > > digits will give a different result. > > Yeah. Worse, casting that to numeric currently gives the "correct" > result: > > regression=# select (502.15::float8 / 10)::numeric; > numeric > --------- > 50.215 > (1 row) > > while if we changed float8_numeric to apply Ryu, the result would be > 50.214999999999996. So that's not great. But there are other cases > where the result would be better than before, such as the OP's example > of 42258656681.38498::float8. I'd like to get my hands around how > many "better" and "worse" cases there would be, but I'm not sure how > to attack that question. The above bug report has a, in my opinion, pretty egregious cases of wrongness. From the bug: postgres[1296822][1]=# select '1234567'::float4::numeric; ┌─────────┐ │ numeric │ ├─────────┤ │ 1234570 │ └─────────┘ (1 row) It seems crazy that we throw away integer precision in the range it's guaranteed to be accurate (that's what, −16777216 to 16777216 for float4, more than a magnitude larger than this value). It does feel different to me that we're throwing away precision that we could know is not just the result of floating point imprecision. I can't really see outputting a bunch of "fake precision" post decimal points digits being comparably bad? I didn't find much discussion about how we could deal with pg_upgrade issues if we were to change the behaviour. Detect indexes involving such casts, and mark them as invalid? Greetings, Andres Freund
В списке pgsql-bugs по дате отправления: