FUNCTION SIG_ARRAY,ARRAY,DIMENSION,N_PAR=N_PAR,MISSING=MISSING
;
    ON_ERROR,2                      ;Return to caller if an error occurs
;
;  Check the number of parameters passed.
;
    IF N_PARAMS() EQ 0 THEN MESSAGE,    $
        'Syntax:  Result = SIG_ARRAY( ARRAY  [, DIMENSION ] )
;
;  Get the number of dimensions of the array.
;
    S = SIZE(ARRAY)
    IF S(0) EQ 0 THEN MESSAGE, 'Variable ARRAY must be an array'
;
;  If the DIMENSION parameter was passed, then check it for validity.
;  over that dimension.
;
    IF N_PARAMS() EQ 2 THEN BEGIN
        IF ((DIMENSION LT 1) OR (DIMENSION GT S(0))) THEN MESSAGE, $
            'DIMENSION out of range'
    ENDIF
;
;  Renormalize the data to the average value.  This avoids problems with
;  roundoff error.
;
    IF (N_PARAMS() EQ 2) AND (S(0) GT 1) THEN BEGIN
        STEMP = LONARR(3)
        IF DIMENSION EQ 1 THEN STEMP(0) = 1 ELSE    $
        STEMP(0) = PRODUCT(S(1:DIMENSION-1))
        STEMP(1) = S(DIMENSION)
        IF DIMENSION EQ S(0) THEN STEMP(2) = 1 ELSE $
        STEMP(2) = PRODUCT(S(DIMENSION+1:S(0)))
        TEMP = REFORM(ARRAY, STEMP)
            DT = DATATYPE(TEMP,2)
            IF (DT LE 2) OR (DT EQ 12) THEN TEMP = FLOAT(TEMP)
            IF (DT GE 13) THEN TEMP = DOUBLE(TEMP)
        A0 = AVERAGE(ARRAY, DIMENSION, MISSING=MISSING)
        FOR I = 0,S(DIMENSION)-1 DO TEMP(*,I,*) = TEMP(*,I,*) - A0
        TEMP = REFORM(TEMP, S(1:S(0)), /OVERWRITE)
    END ELSE BEGIN
        A0 = AVERAGE(ARRAY, MISSING=MISSING)
        TEMP = ARRAY - A0
    ENDELSE
;
;  Change the missing value to reflect the renormalized data.
;
    IF N_ELEMENTS(MISSING) EQ 1 THEN BEGIN
        W = WHERE(ARRAY NE MISSING, COUNT)
        IF COUNT GT 0 THEN BEGIN
        TMISSING = MIN(ARRAY(W))
        IF TMISSING LT 0 THEN TMISSING = 1.1*TMISSING
        IF TMISSING GT 0 THEN TMISSING = 0.9*TMISSING
        IF TMISSING EQ 0 THEN TMISSING = -1
        W = WHERE(ARRAY EQ MISSING, COUNT)
        IF COUNT GT 0 THEN TEMP(W) = TMISSING
        END ELSE TMISSING = TEMP(0)     ;All pixels are missing
    ENDIF
;
;  Form the square of the array, taking into account any missing pixels.
;
    A_SQR = TEMP^2
    IF N_ELEMENTS(TMISSING) EQ 1 THEN BEGIN
        W = WHERE(TEMP EQ TMISSING, COUNT)
        IF COUNT GT 0 THEN A_SQR(W) = TMISSING
    ENDIF
;
;  Calculate the average of the array and of the square of the array.
;
    IF N_PARAMS() EQ 2 THEN BEGIN
        A_AVG = AVERAGE(TEMP, DIMENSION, MISSING=TMISSING)
        A_SQR = AVERAGE(A_SQR, DIMENSION, MISSING=TMISSING)
        N = S(DIMENSION)
    END ELSE BEGIN
        A_AVG = 0
        A_SQR = AVERAGE(A_SQR, MISSING=TMISSING)
        N = N_ELEMENTS(TEMP)
    ENDELSE
;
;  Take into account the number of free parameters.
;
    IF N_ELEMENTS(N_PAR) EQ 1 THEN NPAR = N_PAR ELSE NPAR = 1
    SIG = SQRT(ABS(A_SQR - A_AVG^2) * (N / ((N - NPAR) > 1.)))
;
;  Set any missing pixels to the missing pixel flag value.
;
    IF N_ELEMENTS(TMISSING) EQ 1 THEN BEGIN
        W = WHERE(A_AVG EQ TMISSING, COUNT)
        IF COUNT GT 0 THEN SIG(W) = MISSING
    ENDIF
;
    RETURN, SIG
    END