Обсуждение: gamma() and lgamma() functions
Attached is a patch adding support for the gamma and log-gamma functions. See, for example: https://en.wikipedia.org/wiki/Gamma_function I think these are very useful general-purpose mathematical functions. They're part of C99, and they're commonly included in other mathematical libraries, such as the python math module, so I think it's useful to make them available from SQL. The error-handling for these functions seems to be a little trickier than most, so that might need further discussion. Regards, Dean
Вложения
On Mon, Jul 1, 2024 at 5:33 PM Dean Rasheed <dean.a.rasheed@gmail.com> wrote:
Attached is a patch adding support for the gamma and log-gamma
functions. See, for example:
https://en.wikipedia.org/wiki/Gamma_function
I think these are very useful general-purpose mathematical functions.
They're part of C99, and they're commonly included in other
mathematical libraries, such as the python math module, so I think
it's useful to make them available from SQL.
The error-handling for these functions seems to be a little trickier
than most, so that might need further discussion.
Regards,
Dean
Hi! The patch file seems broken.
git apply gamma-and-lgamma.patch
error: git apply: bad git-diff — exptec /dev/null in line 2
Best regards, Stepan Neretin.
> On 1 Jul 2024, at 16:20, Stepan Neretin <sncfmgg@gmail.com> wrote: > The patch file seems broken. > git apply gamma-and-lgamma.patch error: git apply: bad git-diff — exptec /dev/null in line 2 It's a plain patch file, if you apply it with patch and not git it will work fine: $ patch -p1 < gamma-and-lgamma.patch patching file 'doc/src/sgml/func.sgml' patching file 'src/backend/utils/adt/float.c' patching file 'src/include/catalog/pg_proc.dat' patching file 'src/test/regress/expected/float8.out' patching file 'src/test/regress/sql/float8.sql' -- Daniel Gustafsson
On Mon, Jul 1, 2024 at 5:33 PM Dean Rasheed <dean.a.rasheed@gmail.com> wrote:
Attached is a patch adding support for the gamma and log-gamma
functions. See, for example:
https://en.wikipedia.org/wiki/Gamma_function
I think these are very useful general-purpose mathematical functions.
They're part of C99, and they're commonly included in other
mathematical libraries, such as the python math module, so I think
it's useful to make them available from SQL.
The error-handling for these functions seems to be a little trickier
than most, so that might need further discussion.
Regards,
Dean
ERROR: value out of range: overflow. I think we need to add information about the available ranges in the error message
On 2024-Jul-01, Stepan Neretin wrote: > I have one notice: > ERROR: value out of range: overflow. I think we need to add information > about the available ranges in the error message I think this is a project of its own. The error comes from calling float_overflow_error(), which is a generic routine used in several functions which have different overflow conditions. It's not clear to me that throwing errors listing the specific range for each case is worth the effort. -- Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/ "Escucha y olvidarás; ve y recordarás; haz y entenderás" (Confucio)
On Mon, 1 Jul 2024 at 16:04, Alvaro Herrera <alvherre@alvh.no-ip.org> wrote: > > On 2024-Jul-01, Stepan Neretin wrote: > > > I have one notice: > > ERROR: value out of range: overflow. I think we need to add information > > about the available ranges in the error message > > I think this is a project of its own. The error comes from calling > float_overflow_error(), which is a generic routine used in several > functions which have different overflow conditions. It's not clear to > me that throwing errors listing the specific range for each case is > worth the effort. > Right. It's also worth noting that gamma() has several distinct ranges of validity for which it doesn't overflow, so it'd be hard to codify that succinctly in an error message. Something that bothers me about float.c is that there is precious little consistency as to whether functions raise overflow errors or return infinity. For example, exp() gives an overflow error for sufficiently large (finite) inputs, whereas sinh() and cosh() (very closely related) return infinity. I think raising an error is the more technically correct thing to do, but returning infinity is sometimes perhaps more practically useful. However, given how much more quickly the result from gamma() explodes, I think it's more useful for it to raise an error so that you know you have a problem, and that you probably want to use lgamma() instead. (As an aside, I've seen people (and ChatGPT) write algorithms to solve the Birthday Problem using the gamma() function. That doesn't work because gamma(366) overflows, so you have to use lgamma().) Regards, Dean