postgresql 中的指数问题



我遇到了postgresql中的指数函数问题。如果我select exp(5999)使用此选择语句,我会得到:

ERROR: value out of range: overflow 
SQL state: 22003

如果我select exp(5999.1)使用此选择语句,我会得到指数结果。

在其他情况下,如果我select exp(9999.1)使用此语句,则会收到以下错误:

ERROR: argument for function "exp" too big
SQL state: 22003

请让我知道为什么会发生此问题以及此类问题的解决方案是什么?

我认为您的第一个问题是由exp()的输出类型与输入类型相同这一事实引起的。因为您使用的是整数值,所以它抱怨结果不适合整数。

这可能就是为什么exp(5999.1),并且可能exp(5999.0)工作,浮点类型具有更大的范围。

你的第二个错误略有不同,它抱怨的不是计算过程中溢出,而是输入参数太大。它可能在某处对输入进行了一些健全性检查。

甚至浮点值最终也会超出范围。 e9999 大约是 104300,这是一个相当大的数字,可能远远超出了您在数据库应用程序中看到的预期。

事实上,我会对数据库应用程序中如此大数字的用例感兴趣。这听起来更适合像MPIR这样的bignum软件包。

如果传递INTEGER参数,exp()函数将尝试返回double precision值。刚高于值 n=709,它将达到 64 位浮点数的限制(约 10^308),并且无法计算 e^n。解决方案是使用以下类型传递NUMERIC参数:

SELECT EXP(710); -- failure!
SELECT EXP(710::NUMERIC); -- OK
SELECT EXP(5999.1::NUMERIC); -- huge but OK

编辑!

至于错误:函数"exp"太大SQL状态的参数:22003。我试图写一个解决方法。只需运行这个:

SELECT n, POWER(EXP(1::NUMERIC), n) FROM (VALUES(9998), (9999), (10000)) AS foo (n)

它会起作用。但是然后将9999更改为9999.1,您将再次遇到该愚蠢的错误。这太荒谬了!9999.1 太大了,但 10000 没问题:D看起来波斯特格雷斯不喜欢POWER()论证中的小数点。对不起,但我无法解决这个问题。

一种解决方案是使用幂的算术属性并写POWER(POWER(EXP(1::NUMERIC), n*10), 0.1)但该值组合对于Postgres的幂实现来说仍然太大。祝你的战斗好运。

相关内容

  • 没有找到相关文章

最新更新