Функция не принимает первое возвращаемое значение, откатывается назад, вычисляет другое время и возвращает «ложное» значение [C ++] - PullRequest
0 голосов
/ 08 ноября 2019

Когда я вызываю calc (), он не возвращает мне первое возвращаемое значение для x, вместо этого он возвращается к double x = v1*sqrt((-(2.0*log(s)))/s);, вычисляет x второй раз и возвращает nan.

Отладчик показываетя, прежде чем он попытается вернуть х в первый раз, что значение х -0,525209. Я думал, что это будет приемлемое возвращаемое значение (double).

Кто-нибудь знает, как решить эту проблему или почему он откатывается назад? (извините, я все еще новичок в C ++)

#include <cmath>
#include <cstdlib>
#include <iostream>    

    double calc(){
    double u1 = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);
    double u2 = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);

    double v1 = (2.0*u1)-1.0;
    double v2 = (2.0*u2)-1.0;

    double s = pow(v1, 2.0)+pow(v2, 2.0);

    if (s >= 1.0){
        calc();
    }

    double x = v1*sqrt((-(2.0*log(s)))/s);

    std::cout << "before return " << x << std::endl;

    return x;
}

int main(){
   double hilfe = calc();

   std::cout << "my mumber "<<  hilfe << std::endl;
}

1 Ответ

0 голосов
/ 08 ноября 2019

Полагаю, вы хотите это:

#include <cmath>
#include <cstdlib>
#include <iostream>    

double calc(){
    for (;;) {
    double u1 = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);
    double u2 = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);

    double v1 = (2.0*u1)-1.0;
    double v2 = (2.0*u2)-1.0;

    double s = pow(v1, 2.0)+pow(v2, 2.0);

    if (s >= 1.0)
        continue;

    double x = v1*sqrt((-(2.0*log(s)))/s);

    std::cout << "before return " << x << std::endl;

    return x;  
    }
}

int main(){
   double hilfe = calc();

   std::cout << "my mumber "<<  hilfe << std::endl;
}

Это выбирает новые случайные значения, пока s <1; </p>

...