Re: Greatest Common Divisor
От | Vik Fearing |
---|---|
Тема | Re: Greatest Common Divisor |
Дата | |
Msg-id | 6855727c-3836-21cc-18f9-e79227b99079@2ndquadrant.com обсуждение исходный текст |
Ответ на | Re: Greatest Common Divisor (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: Greatest Common Divisor
|
Список | pgsql-hackers |
On 02/01/2020 16:12, Tom Lane wrote: > Stephen Frost <sfrost@snowman.net> writes: >> * Dean Rasheed (dean.a.rasheed@gmail.com) wrote: >>> I'm not objecting to adding it, I'm just curious. In fact, I think >>> that if we do add this, then we should probably add lcm() at the same >>> time, since handling its overflow cases is sufficiently non-trivial to >>> justify not requiring users to have to implement it themselves. >> I tend to agree with this. > Does this impact the decision about whether we need a variant for > numeric? I was leaning against that, primarily because (a) > it'd introduce a set of questions about what to do with non-integral > inputs, and (b) it'd make the patch quite a lot larger, I imagine. > But a variant of lcm() that returns numeric would have much more > resistance to overflow. > > Maybe we could just define "lcm(bigint, bigint) returns numeric" > and figure that that covers all cases, but it feels slightly > weird. You couldn't do lcm(lcm(a,b),c) without casting. > I guess that particular use-case could be addressed with > "lcm(variadic bigint[]) returns numeric", but that's getting > really odd. Okay. Here is a version that should handle everyone's comments. gcd() is now strictly positive, so INT_MIN is no longer a valid result. I added an lcm() function. It returns the same type as its arguments so overflow is possible. I made this choice because int2mul returns int2 (and same for its friends). One can just cast to a bigger integer if needed. Because of that, I added a version of gcd() and lcm() for numeric. This was my first time working with numeric so reviewers should pay extra attention there, please. Patch attached. -- Vik Fearing
Вложения
В списке pgsql-hackers по дате отправления: