我遇到了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的幂实现来说仍然太大。祝你的战斗好运。