⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pfqfn.cpp

📁 Quantitative Finance C++ source code, asian option pricer
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	    &rmax);
    cmpmul_(numr, numi, &xr2, &xi2, qr2, qi2, wk1, wk2, wk3, wk4, wk5, wk6, &
	    l, &rmax);
    qr2[l + 2] += -1;
    qi2[l + 2] += -1;
    cmpadd_(qr1, qi1, qr2, qi2, numr, numi, wk1, &l, &rmax);

/*     MULTIPLY BY THE SCALING FACTOR, SIGFIG, TO KEEP THE SCALE CORRECT. */

    i__1 = *iq - *ip;
    for (i1 = 1; i1 <= i__1; ++i1) {
	armult_(numr, &sigfig, numr, wk6, &l, &rmax);
	armult_(numi, &sigfig, numi, wk6, &l, &rmax);
/* L210: */
    }

/*     FINALLY, ADD THE NEW NUMERATOR TERM WITH THE CURRENT RUNNING */
/*     SUM OF THE NUMERATOR AND STORE THE NEW RUNNING SUM IN SUMR, SUMI. */

    cmpadd_(sumr, sumi, numr, numi, sumr, sumi, wk1, &l, &rmax);

/*     BECAUSE SIGFIG REPRESENTS "ONE" ON THE NEW SCALE, ADD SIGFIG */
/*     TO THE CURRENT COUNT AND, CONSEQUENTLY, TO THE IP ARGUMENTS */
/*     IN THE NUMERATOR AND THE IQ ARGUMENTS IN THE DENOMINATOR. */

    cnt += sigfig;
    i__1 = *ip;
    for (i1 = 1; i1 <= i__1; ++i1) {
	ar[i1 - 1] += sigfig;
/* L220: */
    }
    i__1 = *iq;
    for (i1 = 1; i1 <= i__1; ++i1) {
	cr[i1 - 1] += sigfig;
/* L230: */
    }
    goto L130;
L240:
    arydiv_(sumr, sumi, denomr, denomi, &final, &l, lnpfq, &rmax, &ibit);
/*     write (6,*) 'Number of terms=',ixcnt */
     ret_val->r = final.r,  ret_val->i = final.i;
    return ;
} /* hyper_ */

/*     **************************************************************** */
/*     *                                                              * */
/*     *                 SUBROUTINE ARADD                             * */
/*     *                                                              * */
/*     *                                                              * */
/*     *  Description : Accepts two arrays of numbers and returns     * */
/*     *    the sum of the array.  Each array is holding the value    * */
/*     *    of one number in the series.  The parameter L is the      * */
/*     *    size of the array representing the number and RMAX is     * */
/*     *    the actual number of digits needed to give the numbers    * */
/*     *    the desired accuracy.                                     * */
/*     *                                                              * */
/*     *  Subprograms called: none                                    * */
/*     *                                                              * */
/*     **************************************************************** */
/* Subroutine */ int aradd_(doublereal *a, doublereal *b, doublereal *c__, 
	doublereal *z__, integer *l, doublereal *rmax)
{
    /* System generated locals */
    integer i__1;
    doublereal d__1;

    /* Builtin functions */
    double d_nint(doublereal *);

    /* Local variables */
    static integer i__, j, ediff;

    /* Parameter adjustments */
    ++z__;
    ++c__;
    ++b;
    ++a;

    /* Function Body */
    i__1 = *l + 1;
    for (i__ = 0; i__ <= i__1; ++i__) {
	z__[i__] = consts_1.zero;
/* L10: */
    }
    d__1 = a[*l + 1] - b[*l + 1];
    ediff = (integer) d_nint(&d__1);
    if (abs(a[1]) < consts_1.half || ediff <= -(*l)) {
	goto L20;
    }
    if (abs(b[1]) < consts_1.half || ediff >= *l) {
	goto L40;
    }
    goto L60;
L20:
    i__1 = *l + 1;
    for (i__ = -1; i__ <= i__1; ++i__) {
	c__[i__] = b[i__];
/* L30: */
    }
    goto L350;
L40:
    i__1 = *l + 1;
    for (i__ = -1; i__ <= i__1; ++i__) {
	c__[i__] = a[i__];
/* L50: */
    }
    goto L350;
L60:
    z__[-1] = a[-1];
    if ((d__1 = a[-1] - b[-1], abs(d__1)) < consts_1.half) {
	goto L80;
    }
    if (ediff > 0) {
	z__[*l + 1] = a[*l + 1];
	goto L190;
    }
    if (ediff < 0) {
	z__[*l + 1] = b[*l + 1];
	z__[-1] = b[-1];
	goto L240;
    }
    i__1 = *l;
    for (i__ = 1; i__ <= i__1; ++i__) {
	if (a[i__] > b[i__]) {
	    z__[*l + 1] = a[*l + 1];
	    goto L190;
	}
	if (a[i__] < b[i__]) {
	    z__[*l + 1] = b[*l + 1];
	    z__[-1] = b[-1];
	    goto L240;
	}
/* L70: */
    }
    goto L300;
L80:
    if (ediff > 0) {
	goto L110;
    }
    if (ediff < 0) {
	goto L150;
    }
    z__[*l + 1] = a[*l + 1];
    for (i__ = *l; i__ >= 1; --i__) {
	z__[i__] = a[i__] + b[i__] + z__[i__];
	if (z__[i__] >= *rmax) {
	    z__[i__] -= *rmax;
	    z__[i__ - 1] = consts_1.one;
	}
/* L90: */
    }
    if (z__[0] > consts_1.half) {
	for (i__ = *l; i__ >= 1; --i__) {
	    z__[i__] = z__[i__ - 1];
/* L100: */
	}
	z__[*l + 1] += consts_1.one;
	z__[0] = consts_1.zero;
    }
    goto L300;
L110:
    z__[*l + 1] = a[*l + 1];
    i__1 = ediff + 1;
    for (i__ = *l; i__ >= i__1; --i__) {
	z__[i__] = a[i__] + b[i__ - ediff] + z__[i__];
	if (z__[i__] >= *rmax) {
	    z__[i__] -= *rmax;
	    z__[i__ - 1] = consts_1.one;
	}
/* L120: */
    }
    for (i__ = ediff; i__ >= 1; --i__) {
	z__[i__] = a[i__] + z__[i__];
	if (z__[i__] >= *rmax) {
	    z__[i__] -= *rmax;
	    z__[i__ - 1] = consts_1.one;
	}
/* L130: */
    }
    if (z__[0] > consts_1.half) {
	for (i__ = *l; i__ >= 1; --i__) {
	    z__[i__] = z__[i__ - 1];
/* L140: */
	}
	++z__[*l + 1];
	z__[0] = consts_1.zero;
    }
    goto L300;
L150:
    z__[*l + 1] = b[*l + 1];
    i__1 = 1 - ediff;
    for (i__ = *l; i__ >= i__1; --i__) {
	z__[i__] = a[i__ + ediff] + b[i__] + z__[i__];
	if (z__[i__] >= *rmax) {
	    z__[i__] -= *rmax;
	    z__[i__ - 1] = consts_1.one;
	}
/* L160: */
    }
    for (i__ = -ediff; i__ >= 1; --i__) {
	z__[i__] = b[i__] + z__[i__];
	if (z__[i__] >= *rmax) {
	    z__[i__] -= *rmax;
	    z__[i__ - 1] = consts_1.one;
	}
/* L170: */
    }
    if (z__[0] > consts_1.half) {
	for (i__ = *l; i__ >= 1; --i__) {
	    z__[i__] = z__[i__ - 1];
/* L180: */
	}
	z__[*l + 1] += consts_1.one;
	z__[0] = consts_1.zero;
    }
    goto L300;
L190:
    if (ediff > 0) {
	goto L210;
    }
    for (i__ = *l; i__ >= 1; --i__) {
	z__[i__] = a[i__] - b[i__] + z__[i__];
	if (z__[i__] < consts_1.zero) {
	    z__[i__] += *rmax;
	    z__[i__ - 1] = -consts_1.one;
	}
/* L200: */
    }
    goto L290;
L210:
    i__1 = ediff + 1;
    for (i__ = *l; i__ >= i__1; --i__) {
	z__[i__] = a[i__] - b[i__ - ediff] + z__[i__];
	if (z__[i__] < consts_1.zero) {
	    z__[i__] += *rmax;
	    z__[i__ - 1] = -consts_1.one;
	}
/* L220: */
    }
    for (i__ = ediff; i__ >= 1; --i__) {
	z__[i__] = a[i__] + z__[i__];
	if (z__[i__] < consts_1.zero) {
	    z__[i__] += *rmax;
	    z__[i__ - 1] = -consts_1.one;
	}
/* L230: */
    }
    goto L290;
L240:
    if (ediff < 0) {
	goto L260;
    }
    for (i__ = *l; i__ >= 1; --i__) {
	z__[i__] = b[i__] - a[i__] + z__[i__];
	if (z__[i__] < consts_1.zero) {
	    z__[i__] += *rmax;
	    z__[i__ - 1] = -consts_1.one;
	}
/* L250: */
    }
    goto L290;
L260:
    i__1 = 1 - ediff;
    for (i__ = *l; i__ >= i__1; --i__) {
	z__[i__] = b[i__] - a[i__ + ediff] + z__[i__];
	if (z__[i__] < consts_1.zero) {
	    z__[i__] += *rmax;
	    z__[i__ - 1] = -consts_1.one;
	}
/* L270: */
    }
    for (i__ = -ediff; i__ >= 1; --i__) {
	z__[i__] = b[i__] + z__[i__];
	if (z__[i__] < consts_1.zero) {
	    z__[i__] += *rmax;
	    z__[i__ - 1] = -consts_1.one;
	}
/* L280: */
    }
L290:
    if (z__[1] > consts_1.half) {
	goto L330;
    }
    i__ = 1;
L300:
    ++i__;
    if (z__[i__] < consts_1.half && i__ < *l + 1) {
	goto L300;
    }
    if (i__ == *l + 1) {
	z__[-1] = consts_1.one;
	z__[*l + 1] = consts_1.zero;
	goto L330;
    }
    i__1 = *l + 1 - i__;
    for (j = 1; j <= i__1; ++j) {
	z__[j] = z__[j + i__ - 1];
/* L310: */
    }
    i__1 = *l;
    for (j = *l + 2 - i__; j <= i__1; ++j) {
	z__[j] = consts_1.zero;
/* L320: */
    }
    z__[*l + 1] = z__[*l + 1] - i__ + 1;
L330:
    i__1 = *l + 1;
    for (i__ = -1; i__ <= i__1; ++i__) {
	c__[i__] = z__[i__];
/* L340: */
    }
L350:
    if (c__[1] < consts_1.half) {
	c__[-1] = consts_1.one;
	c__[*l + 1] = consts_1.zero;
    }
    return 0;
} /* aradd_ */

/*     **************************************************************** */
/*     *                                                              * */
/*     *                 SUBROUTINE ARSUB                             * */
/*     *                                                              * */
/*     *                                                              * */
/*     *  Description : Accepts two arrays and subtracts each element * */
/*     *    in the second array from the element in the first array   * */
/*     *    and returns the solution.  The parameters L and RMAX are  * */
/*     *    the size of the array and the number of digits needed for * */
/*     *    the accuracy, respectively.                               * */
/*     *                                                              * */
/*     *  Subprograms called: ARADD                                   * */
/*     *                                                              * */
/*     **************************************************************** */
/* Subroutine */ int arsub_(doublereal *a, doublereal *b, doublereal *c__, 
	doublereal *wk1, doublereal *wk2, integer *l, doublereal *rmax)
{
    /* System generated locals */
    integer i__1;

    /* Local variables */
    static integer i__;
    extern /* Subroutine */ int aradd_(doublereal *, doublereal *, doublereal 
	    *, doublereal *, integer *, doublereal *);

    /* Parameter adjustments */
    ++wk2;
    ++wk1;
    ++c__;
    ++b;
    ++a;

    /* Function Body */
    i__1 = *l + 1;
    for (i__ = -1; i__ <= i__1; ++i__) {
	wk2[i__] = b[i__];
/* L10: */
    }
    wk2[-1] = -consts_1.one * wk2[-1];
    aradd_(&a[-1], &wk2[-1], &c__[-1], &wk1[-1], l, rmax);
    return 0;
} /* arsub_ */

/*     **************************************************************** */
/*     *                                                              * */
/*     *                 SUBROUTINE ARMULT                            * */
/*     *                                                              * */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -