# v_normcdflog

## PURPOSE

V_NORMCDFLOG calculates log of Normal Cumulative Distribution function p=(x,m,s)

## SYNOPSIS

function p=v_normcdflog(x,m,s)

## DESCRIPTION

    V_NORMCDFLOG calculates log of Normal Cumulative Distribution function p=(x,m,s)

     Inputs:

         X        Input data (vector or matrix)
         M        Mean of Normal distribution [default 0]
         S        Std deviation of Normal distribution [default 1]

     Outputs:

         P        P = log(normcdf(X)); same size as X

     The routine gives accurate values even if X is large and negative

## CROSS-REFERENCE INFORMATION

This function calls:

This function is called by:

## SOURCE CODE

    0001 function p=v_normcdflog(x,m,s)
    0002 %V_NORMCDFLOG calculates log of Normal Cumulative Distribution function p=(x,m,s)
    0003 %
    0004 % Inputs:
    0005 %
    0006 %     X        Input data (vector or matrix)
    0007 %     M        Mean of Normal distribution [default 0]
    0008 %     S        Std deviation of Normal distribution [default 1]
    0009 %
    0010 % Outputs:
    0011 %
    0012 %     P        P = log(normcdf(X)); same size as X
    0013 %
    0014 % The routine gives accurate values even if X is large and negative
    0015
    0016 %      Copyright (C) Mike Brookes 2016
    0017 %      Version: $Id: v_normcdflog.m 10865 2018-09-21 17:22:45Z dmb $
    0018 %
    0019 %   VOICEBOX is a MATLAB toolbox for speech processing.
    0020 %   Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html
    0021 %
    0022 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    0023 %   This program is free software; you can redistribute it and/or modify
    0024 %   it under the terms of the GNU Lesser General Public License as published by
    0025 %   the Free Software Foundation; either version 3 of the License, or
    0026 %   (at your option) any later version.
    0027 %
    0028 %   This program is distributed in the hope that it will be useful,
    0029 %   but WITHOUT ANY WARRANTY; without even the implied warranty of
    0030 %   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    0031 %   GNU Lesser General Public License for more details.
    0032 %
    0033 %   You can obtain a copy of the GNU Lesser General Public License from
    0034 %   https://www.gnu.org/licenses/ .
    0035 %
    0036 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    0037 persistent a b
    0038 if isempty(a)
    0039     a=0.996;
    0040 %   f=@(x) -0.5*(x.^2+log(2*pi))-real(log(-(a+x.^2)./x))-real(log(normcdf(x)));
    0041 %   b=fzero(f,-22);         % cutoff value for conventional formula
    0042     b=-22.2491306156561;    % precalculated value
    0043 end
    0044 if nargin>2
    0045     x=(x-m)/s;
    0046 elseif nargin>1
    0047     x=x-m;
    0048 end
    0049 t=x<b;                                                  % mask for large negative values
    0050 p=zeros(size(x));
    0051 p(~t)=real(log(0.5*erfc(-x(~t).*sqrt(0.5))));           % use this formula normally
    0052 p(t)=-0.5*(x(t).^2+log(2*pi))-real(log(-x(t)-a./x(t))); % use this approximation for large negative x
    0053