Re: Precision loss casting float to numeric

Поиск
Список
Период
Сортировка
От Bear Giles
Тема Re: Precision loss casting float to numeric
Дата
Msg-id CALBNtw5Q7aG8YXvzTd3rkwoSoQcd9K5of-TyTtYhVvhaTRcwLg@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Precision loss casting float to numeric  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers


On Mon, Feb 26, 2018 at 11:29 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Chapman Flack <chap@anastigmatix.net> writes:
> The 0002-*.patch is a proof-of-concept patching float4_numeric and
> float8_numeric in the trivial way (just using FLT_DECIMAL_DIG and
> DBL_DECIMAL_DIG in place of FLT_DIG and DBL_DIG). It makes the new
> regression test pass. (It will only work under a compiler that has
> __FLT_DECIMAL_DIG__ and __DBL_DECIMAL_DIG__ available, and I used
> those internal versions to avoid mucking with build tooling to change
> the target C standard, which I assume wouldn't be welcome anyway.

Nope.  TBH, I'd think about just using "DBL_DIG + 3", given our existing
coding around extra_float_digits in places like pg_dump and postgres_fdw.
The knowledge that you need 2 or 3 extra digits is already well embedded.

Conceivably you could do it like

#ifndef DBL_DECIMAL_DIG
#ifdef __DBL_DECIMAL_DIG__
#define DBL_DECIMAL_DIG __DBL_DECIMAL_DIG__
#else
#define DBL_DECIMAL_DIG (DBL_DIG + 3)
#endif
#endif

but I'm not exactly seeing how that buys us anything.

The bigger question here is whether people actually want this behavioral
change.  I think there's probably a bigger chance of complaints that
"casting 1.1::float8 to numeric now produces some weird,
incorrectly-rounded result" than that we make anyone happier.

I have a vague idea that at some point in the past we discussed making
this conversion use extra_float_digits, which'd allow satisfying both
camps, at the nontrivial price that the conversion would have to be
considered stable not immutable.  We didn't pull the trigger, if this
memory is real at all, presumably because of the mutability issue.

Another idea would be to leave the cast alone and introduce a named
function that does the "exact" conversion.  Possibly that makes nobody
happy, but at least both the cast and the function could be immutable.
It'd dodge backwards-compatibility objections, too.

                        regards, tom lane
 
​Working for a company that ​
has enterprise customers this can't be overemphasized.
Never require the user to do something so they keep getting the same results.​
​ It doesn't
matter if it's "wrong".

​I would vote for a property. If you want the best effort to match the IEEE spec
you need to execute 'set use_ieee_numbers'  and you'll get the extra digits and
rounding behavior. If not ​you'll get the existing behavior.

Bear

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Precision loss casting float to numeric
Следующее
От: Tom Lane
Дата:
Сообщение: Re: invalid memory alloc request size error with commit 4b93f579