張 zi 浩
发布于

OushuDB 实现 标准正态分布函数

CREATE OR REPLACE FUNCTION NORMSDIST(Z IN decimal)
RETURNS decimal AS
BODY

declare
A1 decimal(32, 22) := 0.319381530;
A2 decimal(32, 22) := -0.356563782;
A3 decimal(32, 22) := 1.781477973;
A4 decimal(32, 22) := -1.821255978;
A5 decimal(32, 22) := 1.330274429;
GAMMA decimal(32, 22) := 0.231641900;
X decimal(32, 22);
T decimal(32, 22);
N decimal(32, 22);

begin

X := ABS(Z);
T := 1 / (1 + GAMMA * X);
N := 1 - (1 / (SQRT(2 * ACOS(-1))) * EXP(-Z * Z / 2)) * (A1 * T + A2 * POWER(T, 2) + A3 * POWER(T, 3) + A4 * POWER(T, 4) + A5 * POWER(T, 5));

IF (Z > 6) THEN
RETURN 1;
ELSIF (Z < -6) THEN
RETURN 0;
ELSIF (Z < 0) THEN
RETURN 1.0 - N;
ELSE
RETURN N;
END IF;

end;
BODY
LANGUAGE plpgsql VOLATILE;

评论
    test