C ++ пытается использовать максимум и накапливать функции - PullRequest
0 голосов
/ 04 мая 2019

Я новичок в C ++, и это моя первая программа, которую я пытаюсь написать.В приведенном ниже коде я хочу смоделировать цену опциона и рассчитать его стоимость.Я получаю ошибку для функции накопления.

Я уже пробовал std::max и std::accumulate, но они также не работают.

#include <iostream>
#include <algorithm>
#include <cmath>
#include<random>
#include<numeric>
#include<vector>
using namespace std;

double mc(int S, int K, float r, float vol, int T, int sim, int N){
mt19937 rng;
normal_distribution<>ND(0,1);
ND(rng);
std::vector<double> s(sim);
double dt = T/N;
for(int i =0;i<sim;i++)
{
    std::vector<double> p(N);
    p[0]=S;
    for(int k = 0;k<N;k++)
    {
        double phi = ND(rng);
        p[i+1] = p[i]*(1+r*dt+vol*phi*sqrt(dt));

    }
    s[i] = max(p[N-1]-K,0);

}
        float payoff = (accumulate(s)/sim)*exp(-r*T);
        return payoff;
}

int main(){
    cout << mc(100,100,0.05,0.2,1,100,100) << endl;
    return 0;
}

Ошибки:

> test1.cpp:26:21: error: no matching function for call to 'accumulate'
>     float payoff = (accumulate(s)/sim)*exp(-r*T);
>                     ^~~~~~~~~~ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/numeric:158:1:
> note: candidate function template not viable: requires 3 arguments,
> but 1 was provided accumulate(_InputIterator __first, _InputIterator
> __last, _Tp __init) ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/numeric:168:1:
> note: candidate function template not viable: requires 4 arguments,
> but 1 was provided accumulate(_InputIterator __first, _InputIterator
> __last, _Tp __init, _BinaryOperation __binary_op) ^ 2 errors generated.

РЕДАКТИРОВАТЬ: фиксированный максимумфункция.он использует 0.0 вместо 0

1 Ответ

0 голосов
/ 04 мая 2019

Чтение документации по стандартной библиотеке C ++ на std::accumulate решит вашу проблему. Но так как вы плохо знакомы с языком, а STL немного сложно расшифровать для начинающих, вот как читать документацию.

template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );

std::accumulate - универсальная функция, поэтому она настроена на универсальный тип, T. В вашем случае T = double. Он принимает два входных итератора, first и last, и начальное значение init типа T = double. Итак, ниже приведен пример того, как накапливать std::vector<double>.

std::vector<double> v = { 1., 2., 3. };
double result = std::accumulate(v.begin(), v.end(), 0.);

Обратите внимание, что vector::begin и vector::end возвращают итераторов в начало и конец контейнера соответственно.

Замените ваш вызов на accumulate, используя итераторы и указав начальное значение.

...