1

価格のラティスを生成する関数と、そのラティスを使用して関連するオプションの価格を設定する関数があります。このgenerate_lattice関数は配列に動的にスペースを割り当て、その配列へのポインターが返されます。このポインタはに渡されるものですprice_from_tree。コードは次のとおりです。

#include <iostream>
#include <math.h>

using std::cout;
using std::endl;
using std::max;
using std::nothrow;

double* generate_lattice(double asset_price, double u, double d, int periods)
{
    int nodes = (periods * (periods + 1)) / 2; //Number of nodes = sum(1, # of periods)
    double * lattice; 

    lattice = new (nothrow) double[nodes]; 
    double up, down;
    int price_index = 0;
    for (int period = 0; period < periods + 1; period++) {
        for (int exp = 0; exp < period + 1; exp++) {
            up = pow(1 + u, exp);
            down = pow(1 - d, period - exp);
            lattice[price_index] = asset_price * up * down;
            price_index++;
        }
    }
    return lattice;
}

double price_from_tree(double* lattice, int periods, double strike, double risk_free, double period_len_years, bool euro = true, bool call = true)
{
    int num_prices = ((periods + 1) * (periods + 2)) / 2;
    double asset_max = lattice[num_prices - 1];
    double asset_min = lattice[num_prices - (periods + 1)];
    double asset_t0 = lattice[0];
    double u = pow(asset_max / asset_t0, pow(periods, -1));
    double d = pow(asset_min / asset_t0, pow(periods, -1));
    double p = (exp(risk_free * period_len_years) - d) / (u - d);
    double p_minus1 = 1 - p;
    int start_node;
    if (euro == true) { start_node = num_prices - periods - 1; }
    else { start_node = 0; }
    int sign;
    if (call == true) { sign = 1; }
    else { sign = -1; }
    for (int node = start_node; node < num_prices; node++) {
        lattice[node] = max(sign * (lattice[node] - strike), 0.0);
    }
    int price_index = num_prices - 1;
    double pv_mult = exp(-risk_free * period_len_years);
    double down_payoff, up_payoff, prev_payoff;
    for (int period = periods + 1; period > 0; period--) {
        for (int node = 0; node < period - 1; node++) {
            down_payoff = lattice[price_index - (node + 1)];
            up_payoff = lattice[price_index - node];
            prev_payoff = pv_mult * (p * up_payoff + p_minus1 * down_payoff);
            if (euro == false) {
                prev_payoff = max(lattice[price_index - (node + 1) - (period - 1)], prev_payoff);
            }
            lattice[price_index - (node + 1) - (period - 1)] = prev_payoff;
        }
        price_index -= period;
    }
    return lattice[0];
}

int main(int argc, char** argv)
{
    double* lattice = generate_lattice(100, 0.10, 0.10, 2);
    double option1 = price_from_tree(lattice, 2, 105, 0.05, 1, true, true);
    cout<<"option 1: "<<option1<<endl;
    double* lattice2 = generate_lattice(100, 0.10, 0.10, 2);
    return 0;
}

コードを実行すると、次の出力が得られます。

オプション1:8.28214テスト:malloc.c:3096:sYSMALLOc:アサーション `(old_top ==(((mbinptr)(((char *)&((av)-> bins [((1)-1)* 2] ))--__builtin_offsetof(struct malloc_chunk、fd))))&& old_size == 0)|| ((unsigned long)(old_size)

=(unsigned long)((((__ builtin_offsetof(struct malloc_chunk、fd_nextsize))+((2 *(sizeof(size_t)))-1))&〜((2 *(sizeof(size_t)))-1)) )&&((old_top)-> size&0x1)&&((unsigned long)old_end&pagemask)== 0)'が失敗しました。中止

------------------
(program exited with code: 134)

エラー134で見つけることができるのは、次の行に沿った説明だけです。コードは、試したすべての場合にThe job is killed with an abort signal.正しい値を返しますが、複数の呼び出しを含めると、指定されたエラーで失敗します。メモリ内で混乱を引き起こす私の機能に問題がありますか?この場合、ベクトルを使用したほうがいいですか?price_from_treegenerate_latticeprice_from_tree

4

5 に答える 5

3

ヒープがかなりひどく破損しています。valgrindを使用して実行している場合(Linuxマシンを使用していると仮定)、大量のエラーが発生します。

==23357== Invalid write of size 8
==23357==    at 0x400B9E: generate_lattice(double, double, double, int) (so.cpp:21)
==23357==    by 0x400FC4: main (so.cpp:68)
==23357==  Address 0x595b058 is 0 bytes after a block of size 24 alloc'd
==23357==    at 0x4C27FFB: operator new[](unsigned long, std::nothrow_t const&) (vg_replace_malloc.c:325)
==23357==    by 0x400B1A: generate_lattice(double, double, double, int) (so.cpp:14)
==23357==    by 0x400FC4: main (so.cpp:68)
于 2012-05-08T18:48:39.827 に答える
1

あなたの数学はオフです。でgenerate_latticeprice_indexを超えて成長します(periods * (periods + 1)) / 2。試す:

int nodes = ((periods+1) * (periods + 2)) / 2; //Number of nodes = sum(1, # of periods + 1)
于 2012-05-08T18:46:46.500 に答える
1

共有1次元配列へのインデックスの計算はlattice、2つの関数間で一貫性がありません。

(periods * (periods + 1)) / 2;       // generate_lattice
((periods + 1) * (periods + 2)) / 2; // price_from_tree 

これは、関連するmallocエラーの原因である可能性があります。

于 2012-05-08T18:47:50.873 に答える
1

generate_latticeサイズn*(n + 1)/ 2の配列を作成しますが、この配列の(n + 1)*(n + 1)要素を初期化します。それはおそらくヒープまたはそのような奇妙なものを破壊しています。

私は見ていませんでしたが、配列としてprice_from_tree使用しているだけの場合lattice、問題が発生することはないと思います(最後までやり遂げない限り)。

于 2012-05-08T18:48:31.437 に答える
0

ノードの数を誤って計算しているため、配列の最後から実行しています。期間=2で試してください。<期間+1を実行しているため、ノードを(periods + 1)*(periods + 2)/2として計算する必要があります。

于 2012-05-08T18:50:27.990 に答える