Ошибка математической функции PostgreSQL - PullRequest
1 голос
/ 14 августа 2010

Я получаю сообщение об ошибке от детерминированной функции PG, которая кажется зависимой от того, когда я вызываю ее в запросе.

Функция:

CREATE OR REPLACE FUNCTION ircm(starting_money numeric, value numeric, days numeric)
RETURNS numeric
AS $$
BEGIN
-- Calculate effective interest rate, compounded monthly.
    RETURN 12*(pow((value/starting_money),(1./(12.*(days/365.)))) - 1);
END;
$$ LANGUAGE plpgsql;

Если я вызываю еев простом операторе SELECT все работает нормально:

SELECT ircm(100.00,60.427500643787215,30)
Result: -4.79925436505569765596

Однако, когда я выполняю тот же самый вызов из другого оператора SELECT с использованием подзапроса:

SELECT
    ircm(100.00,m.v::numeric,30) AS result
FROM(
    SELECT 60.427500643787215 AS v
) m

Я получаю ошибку:

ERROR:  a negative number raised to a non-integer power yields a complex result
CONTEXT:  PL/pgSQL function "ircm" line 6 at RETURN

Поскольку вызовы логически эквивалентны, как PG может возвращать ошибку для одного вызова, но не для другого?Я убедился, что в моей базе данных есть только одно определение функции ircm.Я попытался удалить / добавить это снова, чтобы удостовериться, что PG каким-то образом не кэширует искаженное определение.

1 Ответ

0 голосов
/ 28 сентября 2010

Какая версия и на какой платформе работает ваша база данных?

Вы пытались переписать функцию в SQL:

CREATE OR REPLACE FUNCTION ircm(numeric, numeric, numeric)
RETURNS numeric AS $$
    select 12 * (pow(($2 / $1), (1. / (12.* ($3 / 365.)))) - 1);
$$ LANGUAGE sql immutable;

Я использую v8.4.4 в Solaris, Linux,и Mac OS X и достичь тех же результатов из вашей версии plpgsql (и моего SQL), вызываемой напрямую и из подзапроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...