Что делать, если уравнение возвращает nan в качестве ответа?

0

У меня была небольшая проблема с моей программой, что я пытаюсь сделать, это разработать способ для пользователей имитировать возможные сильные стороны паролей. Это предполагает, что все пароли являются перестановками (это странно, я знаю, но я полагаю, что это означает, что данные становятся еще более громоздкими.) Используя уравнение...

//п!/(Пг)! когда n! = (e ^ -n) * (n ^ n) sqrt (2 (pi) n). Когда n - количество используемых символов, а r - длина пароля

Независимо от того, что я ставлю, я получаю nan в качестве ответа. Я думал, что, возможно, мое уравнение было выключено (возможно, каким-то образом я делясь на ноль), поэтому я переработал его и упростил его. Но это не похоже на проблему, хотя я чувствую, что это приблизило меня к правильности. Но у меня была мысль, что, возможно, числовое переполнение имеет эффект здесь? Но я действительно не знаю, как это исправить. Я пытался перескакивать с разных типов данных, но ничего не работало.

У меня также проблема с модулем. Он возвращает обратно числа меньше нуля за время, поэтому с моим знанием noobish, который говорит мне, что, может быть, я переполняю его снова, но как еще я буду использовать% без определения его как int? Может быть, исправление вышеуказанной проблемы сработает?

Я был бы благодарен за любую помощь, оказанную мне. Как можно заниматься обратными значениями nan? Существует ли пошаговое статус-кво для его решения? Это почти всегда переполнение или может быть что-то еще?

Сам код.

#include <iostream>
#include <cmath>

using namespace std;

const int SECONDS_IN_YEAR = 31556926;
const int SECONDS_IN_DAY  = 86400;
const int SECONDS_IN_HOUR = 3600;
const int SECONDS_IN_MIN  = 60;

int main()
{

    int passwordLength ,characterSymbols;
    double instructionsPerSecond, instructionSuccess;

    ////////////////////////////////////////////////////////////////////////////////
    //Equations needed
    // n!/(n-r)!
    //n is the number of letters in the alphabet
    //and r is the number of letters in the password

    // n! = (e^-n)*(n^n) sqrt(2(pi)n)
    double numeratorFactorial  = (pow(M_E,-characterSymbols))
                                *(pow(characterSymbols,characterSymbols))
                                *(sqrt(2*M_PI*characterSymbols));
    // (n-r)
    double characterMinusLength= (characterSymbols-passwordLength);

    // (n-r)! = (e^-(n-r)) * ((n-r)^(n-r)) * sqrt(2(pi)(n-r))
    double denominatorFactorial = ((pow(M_E, -(characterMinusLength)))*
                                (pow((characterMinusLength),(characterMinusLength)))
                                * (sqrt(2*M_PI*(characterMinusLength))));

    // n!/(n-r)!
    long double passwordPermutation = (numeratorFactorial / denominatorFactorial);

    // (passwords)* (instructions/Password) * (seconds/instruction) = sec
    int passwordSeconds = (passwordPermutation * instructionSuccess)
                         *(1/instructionsPerSecond);



    int passwordMin  = passwordSeconds / SECONDS_IN_MIN ;
    int passwordHour = passwordSeconds / SECONDS_IN_HOUR;
    int passwordDay  = passwordSeconds / SECONDS_IN_DAY ;
    int passwordYear = passwordSeconds / SECONDS_IN_YEAR;


    ////////////////////////////////////////////////////////////////////////////////
    //Explain purpose of program
    cout << "This program is designed to simulate the strength of passwords." << endl;

    //Ask for alphabet
    cout << "But first, share with me the max number of characters you'd be using."
         << endl;
    cin >> characterSymbols;
    //Reflect information
    cout << "We will be using " << characterSymbols << " character symbols to "
         << " construct the password.\n" << endl;



    ///////////////////////////////////////////////////////////////////////////////
    //Input length of password
    cout << "\n\nWill you give me the length of proposed password?" << endl;
    cin >> passwordLength;

    //Repeat information
    cout << "The password length will be " << passwordLength << "." <<endl;



    //cout permutations
    cout << "This would lead to " << passwordPermutation << " unique password\n"
         << endl;



    ////////////////////////////////////////////////////////////////////////////////
    //Ask for computer strength
    cout << "How powerful is this computer? How many instructions per second " << endl;
    cout << "can it accomplish?" << endl;
    cin >> instructionsPerSecond;

    //Read out computer strength
    cout << "The computer can do " << instructionsPerSecond << " instructions/second"
         << endl << endl;



    ////////////////////////////////////////////////////////////////////////////////

    //Ask for instructions/password
    cout << "The number of instructions needed to test your password is." << endl
         << endl;
    cin >> instructionSuccess;

    //reflect
    cout << "This computer can do " << instructionSuccess
     << " instructions/password" << endl;


    ////////////////////////////////////////////////////////////////////////////////
    cout << "\n\nThe amount of seconds it'll take to crack this passcode is... "
         << endl << passwordSeconds << " seconds.\n\n\n\n\n" << endl;

    ////////////////////////////////////////////////////////////////////////////////
    //Reflect all information in an easily readable table
    cout << "Number of character symbols using... " << characterSymbols      << endl;
    cout << "Length of password... "                << passwordLength        << endl;
    cout << "Number of permutations... "            << passwordPermutation   << endl;
    cout << "Instructions per second... "           << instructionsPerSecond << endl;
    cout << "Instructions per password..."          << instructionSuccess    << endl;

    cout << endl << endl << endl;

    ////////////////////////////////////////////////////////////////////////////////
    //Add in conversions for min, hour, day, years
    cout << "Number of seconds to break..." << passwordSeconds << endl;


    cout << "Converted to minutes..."       << passwordMin     << endl;
    passwordMin = passwordSeconds / SECONDS_IN_MIN;
    passwordSeconds = passwordSeconds % SECONDS_IN_MIN;

    cout << "Converted to hours..."         << passwordHour    << endl;
    passwordHour = passwordSeconds / SECONDS_IN_HOUR;
    passwordSeconds = passwordSeconds % SECONDS_IN_MIN;

    cout << "Converted to days..."          << passwordDay     << endl;
    passwordDay = passwordSeconds / SECONDS_IN_DAY;
    passwordSeconds = passwordSeconds % SECONDS_IN_DAY;

    cout << "Converted to years..."         << passwordYear    << endl;
    passwordYear = passwordSeconds / SECONDS_IN_YEAR;
    passwordSeconds = passwordSeconds % SECONDS_IN_YEAR;

    return (0);
}
Теги:
modulus
nan
overflow
stack-overflow

2 ответа

2

"nan" означает "не число". Это происходит потому, что вы указали переменные characterSymbols и passwordLength, не указав им начальное значение.

Вы должны инициализировать любую переменную, прежде чем использовать ее, - если вы этого не сделаете, вы будете иметь неопределенное поведение. Например:

int x;
int y;
int z = x + y;

Невозможно предсказать, что z будет здесь равным, потому что мы не знаем, что x или y равны. Точно так же ваш код должен выглядеть примерно так:

int characterSymbols = 10;  //or whatever you want the initial value to be

...

double numeratorFactorial  = (pow(M_E,-characterSymbols))
                            *(pow(characterSymbols,characterSymbols))
                            *(sqrt(2*M_PI*characterSymbols));

Таким образом, числительFactorial будет иметь действительное значение.

0

Кажется, вы думаете, что объявляете "уравнения", когда вы фактически объявляете переменные. Ты пишешь:

double numeratorFactorial  = (pow(M_E,-characterSymbols))
                            *(pow(characterSymbols,characterSymbols))
                            *(sqrt(2*M_PI*characterSymbols));

Но characterSymbols не определен, только "объявлен". characterSymbols объявлен над ним, но он не имеет значения... пока. Позже вы используете cin чтобы получить в нем значение, но когда вы сначала объявляете numeratorFactorial вы не можете просто ожидать, что программа будет вставлять значение в numeratorFactorial при изменении characterSymbols.

Некоторые определения, вероятно, находятся в следующем порядке: оператор double numeratorFactorial = some_value; создает переменную с именем numeratorFactorial и использует some_value для немедленного заполнения этой переменной. То, что вы хотите, - это функция, логическое выражение, в котором вы можете "передавать значения", чтобы значения генерировались, когда они вам понадобятся. Например, для факториала числителя:

double numeratorFactorial(double characterSymbols) {
    return  (pow(M_E,-characterSymbols))
           *(pow(characterSymbols,characterSymbols))
           *(sqrt(2*M_PI*characterSymbols));
}

int main() {
    std::cout << "Numerator Factorial test: " << numeratorFactorial(5.0) << std::endl;
}

Обратите внимание: вы не можете объявить функцию в основной функции.

Такого рода вещи - основы программирования, и кажется, что вы пытаетесь бежать, прежде чем научитесь ходить. Получите хорошую книгу, как C++ Primer и пошагите себя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню