C++. Как избавиться от nan?

В задании нужно вычислить ln (tg x) с обработкой исключительных ситуаций. Вот код:

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

using namespace std;

int main()
{
    srand(time(0));

for(int i = 0; i<50; i++)
{
    try
    {
        int temp = rand()%41 - 20; // x від -20 до 20

        for(int n = -7; n < 7; n++)
        {
            double k, t;
            k = 3.14*n;
            t = (3.14/2) + (3.14*n);

            if((temp <= k)&&(temp >= t))
                throw (double)temp;

        }

            cout << "x = " << temp << "\t" << "y = ";
            cout << log(tan(temp)) << endl; //ln(tg(x))

    }

    catch(double a)
    {
       cout << "x does not belong to the domain of a function: ";
       cout << a;
    }
}

}

При компиляции временами выдаёт nan в y. Я в принципе возможно догадываюсь где ошибка (из-за for(int n = -7; n < 7; n++) выкидывает несколько "вариантов" temp потому catch не реагирует? ну, или ошибка где-то ещё), но никак не могу придумать её решение. Помогите, пожалуйста. Я начинающий, так что прошу пояснения подетальнее или хотя бы пример кода, как это можно исправить.


Ответы (1 шт):

Автор решения: Mikhailo

Может, заменить

cout << "x = " << temp << "\t" << "y = ";
cout << log(tan(temp)) << endl; //ln(tg(x))

на

if (tan(temp) > 0) {
    cout << "x = " << temp << "\t" << "y = ";
    cout << log(tan(temp)) << endl; //ln(tg(x))
    }
else throw double(temp);
    

?

→ Ссылка