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
編集!
ERROR: argument for function "exp" too big SQL state: 22003 については。回避策を書いてみました。これを実行するだけです:
SELECT n, POWER(EXP(1::NUMERIC), n) FROM (VALUES(9998), (9999), (10000)) AS foo (n)
そしてそれはうまくいくでしょう。しかし、その後 9999 を 9999.1 に変更すると、再び愚かなエラーが発生します。ばかげてる!9999.1 は大きすぎますPOWER()
が、10000 は問題ありません:D Postgres はの引数の小数点を好まないようです。申し訳ありませんが、それを修正することはできません。
1 つの解決策は、power と write の算術プロパティを使用することPOWER(POWER(EXP(1::NUMERIC), n*10), 0.1)
ですが、その値の組み合わせは Postgres の power の実装にはまだ大きすぎます。あなたの戦いで頑張ってください。